是否可以在PHP中转储参数表达式?

时间:2011-10-28 13:56:47

标签: php

对于 PHP测试脚本,我需要一个函数report()来报告某些表达式的结果,例如:

report(in_array(null, $array));
report(in_array(false, $array)); 
# etc...

输出应如下所示:

in_array(null, $array) => false
in_array(false, $array) => true

所以我想打印表达式和结果。因此,在报告函数中,我需要一些方法来打印调用者给出的表达式:

function report($expr)
{
    SOME_FUNCTION($expr) 
        # function I'm looking for!!
        # function which would write the string 'in_array(null, $array)' to output!
    echo " => ";
    echo $expr;
    echo "<br>";
}

是否有任何此类函数可以转储调用者给出的表达式? 我知道这不是“正常”的功能,这需要以某种方式绑定到PHP内部。但如果有debug_print_backtrace()__FUNCTION____LINE__之类的神奇内容,那么我认为还有一些机会......

1 个答案:

答案 0 :(得分:3)

直接地说,没有干净的方法可以做你想做的事。

话虽如此,您可以使用debug_backtrace来获取堆栈。然后,您需要做的就是将堆栈向后移动一个(转到第二个数组元素),然后获得文件和行信息。然后,您需要解析该行以提取函数名称和输入。

不干净。这可能不容易。它不会100%可靠。但它适用于大多数情况......

这是一个实用程序功能的简单案例。只需用函数名称调用它,它就会给你函数的文字调用者:

function getArgs($func) {
    $d = debug_backtrace();
    $call = $d[1];
    $file = file($call['file']);
    $line = $file[$call['line'] - 1];
    if (preg_match('(' . preg_quote($func, '(') . '\((.*)\);)', $line, $match)) {
        return $match[1];
    }
    return $line;
}

这是一个例子:

function doSomething($arg) {
    $call = getArgs(__FUNCTION__);
    echo $call . ' - ' . $arg;
}

doSomething(strlen('foo'));

输出:

  

strlen('foo') - 3