我知道这不是完全反思,而是一种.我想创建一个获取变量的调试函数并输出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次击键.