我知道这不是完全反映,而是一种。 我想创建一个获取变量的调试函数并输出var_dump和变量名。
当然,当程序员写一个函数调用时,他们已经知道变量的名字,所以他们可以这样写:
debug( $myvar, 'myvar' );
但我希望它能快速轻松地编写,只需要函数名称,变量和voilà!
debug( $myvar ); // quicker and easier :)
答案 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)
不优雅...... 但你可以伪装!
$a = 10 //becomes $a = '0a'; $$a = 10;
附录:只有在你
时才这样做答案 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>';
}