奇怪的PHP内省:从函数调用获取原始变量NAMES?

时间:2014-01-30 16:21:46

标签: php function variables reflection introspection

我有一个奇怪的问题,这可能是不可能的,但值得一提的是,如果有任何PHP内部人员知道如何做到这一点。有没有办法从PHP中的函数调用中获取变量名?举个例子比较容易:

function fn($argument) {
    echo SOME_MAGIC_FUNCTION();
}

$var1 = "foo";
$var2 = "bar";

fn($var1); // outputs "$var1", not "foo"
fn($var2); // outputs "$var2", not "bar"

在你说出来之前 - 是的,我知道这将是一个糟糕的主意,在生产代码中没有用处。但是,我正在将一些旧代码迁移到新代码中,这样我就可以非常轻松地自动生成替换代码。谢谢!

1 个答案:

答案 0 :(得分:1)

debug_backtrace()返回有关当前调用堆栈的信息,包括对当前函数的调用的文件和行号。您可以读取当前脚本并解析包含调用的行,以找出参数的变量名称。

带有debug_backtrace的测试脚本:

<?php
function getFirstArgName() {
    $calls=debug_backtrace();
    $nearest_call=$calls[1];

    $lines=explode("\n", file_get_contents($nearest_call["file"]));

    $calling_code=$lines[$nearest_call["line"]-1];

    $regex="/".$nearest_call["function"]."\\(([^\\)]+)\\)/";

    preg_match_all($regex, $calling_code, $matches);

    $args=preg_split("/\\s*,\\s*/", $matches[1][0]);

    return $args[0];
}

function fn($argument) {
    echo getFirstArgName();
}

$var1 = "foo";
$var2 = "bar";

fn($var1);
fn($var2);
?>

输出:

$var1$var2
相关问题