有没有办法获得变量的名称? PHP - 反思

时间:2009-08-13 13:41:13

标签: php reflection

我知道这不是完全反映,而是一种。 我想创建一个获取变量的调试函数并输出var_dump和变量名。

当然,当程序员写一个函数调用时,他们已经知道变量的名字,所以他们可以这样写:

debug( $myvar, 'myvar' );

但我希望它能快速轻松地编写,只需要函数名称,变量和voilà!

debug( $myvar ); // quicker and easier :)

11 个答案:

答案 0 :(得分:9)

您可以通过将变量转换为键/值集,然后再将其传递给函数来实现。

function varName($theVar) {  
   $variableName = key($theVar);  
   $variableValue = $theVar[$variableName];  
   echo ('The name of the variable used in the function call was '.$variableName.'<br />');  
   echo ('The value of the variable used in the function call was '.$variableValue.'<br />');  
}
$myVar = 'abc';
varName(compact('myVar'));

虽然我不建议创建对无名变量的引用,但function varName(&$theVar)也可以。

由于compact()将变量名称作为字符串而不是实际变量,因此迭代变量名称列表应该很容易。

至于你为什么要这样做 - 不要问我,但似乎有很多人问这个问题,所以这是我的解决方案。

答案 1 :(得分:5)

我知道我正在回答一个4岁的问题,但到底是怎么回事......

compact()可能会帮助你成为你的朋友!

我做了一个类似的功能,可以快速将一些选定变量的信息转储到日志中以便调试错误,它是这样的:

function vlog() {
    $args = func_get_args();
    foreach ($args as $arg) {
        global ${$arg};
    }
    return json_encode(compact($args));
}

我发现JSON是我日志中这些转储最干净,最易读的形式,但你也可以使用像print_r()或var_export()这样的东西。

这就是我使用它的方式:

$foo = 'Elvis';
$bar = 42;
$obj = new SomeFancyObject();

log('Something went wrong! vars='.vlog('foo', 'bar', 'obj'));

这会像这样打印到日志中:

  

出了点问题! vars = {“foo”:“Elvis”,“bar”:42,“obj”:{“nestedProperty1”:1,“nestedProperty2”:“etc。”}}

警告语:这只适用于在全局范围内声明的变量(因此不在函数或类中。在那里你需要直接唤起compact(),以便它可以访问该范围,但那不是真的那样因为这个vlog()基本上只是json_encode(compact('foo','bar','obj'))的快捷方式,所以我每次需要时都会节省16次击键。

答案 2 :(得分:4)

不,不可能。遗憾。

答案 3 :(得分:2)

不,你会越接近get_defined_vars()。

编辑:我错了,在阅读了有关get_defined_vars()的用户评论后,可能会有点破解:

function ev($variable){
    foreach($GLOBALS as $key => $value){
        if($variable===$value){
            echo '<p>$'.$key.' - '.$value.'</p>';
        }
    }
}

$lol = 123;

ev($lol); // $lol - 123

仅适用于唯一可变内容。

答案 4 :(得分:2)

我之前有过相同的想法,但如果你真的想到它,你就会明白为什么这是不可能的......大概你的debug函数会定义如下:function debug($someVar) { }和它没有办法知道原始变量被称为$myvar

你能做的绝对最好的事情就是看get_defined_vars()$_GLOBALS之类的东西(如果出于某种原因它是全局的)并循环找到与你的价值相匹配的东西变量。这是一个非常hacky,不是很可靠的方法。你原来的方法是最有效的方法。

答案 5 :(得分:2)

不优雅...... 但你可以伪装

  • 1)饮酒足以说服自己这是一个好主意(这需要很多)
  • 2)用变量变量替换所有变量:
$a = 10
//becomes
$a = '0a';
$$a = 10;
  • 3)在所有代码中引用$$ a。
  • 4)当您需要打印变量时,请打印$ a并去掉前导0。

附录:只有在你

时才这样做
  • 绝不向任何人展示此代码
  • 永远不需要更改或维护此代码
  • 很疯狂
  • 不是为了工作而这样做
  • 看,从来没有这样做,这是一个笑话

答案 6 :(得分:1)

这里的比赛迟到了,但是13号马赫有一个有趣的解决方案:How to get a variable name as a string in PHP

答案 7 :(得分:0)

您可以使用eval:

function debug($variablename)
{
  echo ($variablename . ":<br/>");
  eval("global $". $variablename . ";");
  eval("var_dump($" . $variablename . ");");
}

用法:debug("myvar")不是debug($myvar)

答案 8 :(得分:0)

我相信Alix和nickf暗示:

function debug($variablename)
{
  echo ($variablename . ":<br/>");
  global $$variablename; // enable scope
  var_dump($$variablename);
}

我已经测试了它,它看起来和Wagger的代码一样好用(感谢Wagger:我已经尝试了很多次来编写这个并且全局变量声明是我的绊脚石)

答案 9 :(得分:0)

这是迟到的帖子,但我认为现在可以使用compact方法

所以代码是

$a=1;
$b=2;
$c=3

var_dump(compact('a','b','c'));

输出将是

array (size=3)
'a' => int 1
'b' => int 2
'c' => int 3

其中变量名称a,b和c是键

希望这有帮助

答案 10 :(得分:0)

我知道这已经非常晚了,但我以不同的方式做到了。

它可能对性能有点不好,但因为它是用于调试它不应该是一个问题。

我在调用函数的行中读取了调用函数的文件,并删除了变量名。

function dump($str){
    // Get the caller with debug backtrace
    $bt = debug_backtrace();
    $caller = array_shift($bt);

    // Put the file where the function was called in an array, split by lines
    $readFileStr = file($caller['file']);

    // Read the specific line where the function was called
    $lineStr = $readFileStr[$caller['line'] -1];

    // Get the variable name (including $) by taking the string between '(' and ')'
    $regularOutput = preg_match('/\((.*?)\)/', $lineStr, $output);
    $variableName = $output[1];

    // echo the var name and in which file and line it was called
    echo "var: " . $variableName . " dumped in file: " . $caller['file'] . ' on line: ' . $caller['line'] . '<br>';

    // dump the given variable
    echo '<pre>' . var_export($str, true) . '</pre>';
}