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

Pet*_*uza 12 php reflection

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

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

debug( $myvar, 'myvar' );
Run Code Online (Sandbox Code Playgroud)

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

debug( $myvar ); // quicker and easier :)
Run Code Online (Sandbox Code Playgroud)

小智 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'));
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 5

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

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

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

function vlog() {
    $args = func_get_args();
    foreach ($args as $arg) {
        global ${$arg};
    }
    return json_encode(compact($args));
}
Run Code Online (Sandbox Code Playgroud)

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

这就是我使用它的方式:

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

log('Something went wrong! vars='.vlog('foo', 'bar', 'obj'));
Run Code Online (Sandbox Code Playgroud)

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

有些不对劲!vars = {"foo":"Elvis","bar":42,"obj":{"nestedProperty1":1,"nestedProperty2":"etc."}}

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