如何在函数内找到变量的名称?

rub*_*o77 3 php

我有一个功能

function my_dump($a,$name){
    echo '<pre>'.$name.":\n";
    var_export($a);
    echo '</pre>';
}
Run Code Online (Sandbox Code Playgroud)

如何只使用一个参数来实现这一点,以便函数识别被调用变量本身的名称?

例如:

my_dump($cool_variable_name);
Run Code Online (Sandbox Code Playgroud)

将输出:

名称:"cool_variable_name"
内容:array(...

Mar*_*ker 8

如果你需要调试代码,那么使用像xdebug这样的工具比自制的变量转储更加灵活和高效; 但是debug_backtrace()(虽然开销很大)可能会给你你需要的东西.提取调试转储函数调用的文件名和行号,并解析该行以提取调用函数时使用的变量名称

function my_dump($a) {
    $backtrace = debug_backtrace()[0];
    $fh = fopen($backtrace['file'], 'r');
    $line = 0;
    while (++$line <= $backtrace['line']) {
        $code = fgets($fh);
    }
    fclose($fh);
    preg_match('/' . __FUNCTION__ . '\s*\((.*)\)\s*;/u', $code, $name);
    echo '<pre>'.trim($name[1]).":\n";
    var_export($a);
    echo '</pre>';
}


$foo = 'bar';

$baz = array(
    'Hello',
    'World'
);

my_dump($foo);
my_dump(
    $baz
);
Run Code Online (Sandbox Code Playgroud)

如果您的PHP版本不支持阵列解除引用,请更改

$backtrace = debug_backtrace()[0];
Run Code Online (Sandbox Code Playgroud)

$backtrace = debug_backtrace();
$backtrace = $backtrace[0];
Run Code Online (Sandbox Code Playgroud)

如果你对my_dump()的调用跨越多行(比如我的$ baz示例),你需要一个稍微复杂的解析器来从你的代码中提取变量名.