【问题标题】:Get variables in scope at each PHP backtrace level?在每个 PHP 回溯级别获取范围内的变量?
【发布时间】:2011-03-26 00:11:54
【问题描述】:

有没有办法在回溯中查看每个堆栈帧中设置的变量?我可以非常接近地使用debug_backtrace(true) 的组合来获取对象,get_object_vars 在每个对象上获取 $this 变量,args 键在每个回溯帧中,get_defined_vars 来获取全局变量,但任何临时在函数中设置的变量我找不到检索方法。

这是一个示例情况:

function method1($foo) {
    $temp = method2($foo + 1);
    foreach ($temp as $t) {
        method2($t);
    }
}

function method2($bar) {
    $temp2 = $bar->value + $_GET['val'];
    debug();
}

function debug() {
    // to be created
    $global_scope = get_defined_vars();
    $bt = debug_backtrace(true);
}

可以通过回溯中的args 键获得$foo$bar,通过get_object_vars 获得$bar 的对象变量,通过get_defined_vars 获得全局变量。我想要也获得$temp2$temp 的值。

【问题讨论】:

  • 很好奇你需要这个做什么。
  • XDebug 不能满足您的需求吗?安装一个非常简单的调试器时,为什么要重新发明一个成熟的调试器?
  • 据我所知,XDebug 也只能做顶层堆栈:“使用 xdebug.show_local_vars 设置,您可以指示 Xdebug 为用户显示顶层堆栈级别中可用的所有变量也定义了函数。”部分原因是我可以通过将值绑定到突出显示的源输出变量来快速检查值 Firebug 样式。另一部分只是为了好玩。
  • 很遗憾,我在the docs 中也找不到任何内容。 Python can do it,不明白为什么 PHP 不能。
  • 这也是我一直在寻找的。至少我现在知道这是不可能的。除非是现在?这对于调试和准确查看哪里出了问题以及变量具有意外值的位置非常有帮助。

标签: php scope backtrace


【解决方案1】:

更改您的调试以获取 1 个参数。然后只需传入get_defined_vars。这将为您提供本地范围内所有变量的数组。

【讨论】:

  • 我已经使用该方法获取本地变量,问题是在 OTHER 堆栈帧中获取本地变量。
【解决方案2】:

在您的(本地)服务器上安装并启用 XDebug。然后使用xdebug_get_declared_vars()。确保在 xdebug .ini 文件中将 xdebug.collect_vars 设置为 On。

示例:

<?php
    class strings {
        static function fix_strings($a, $b) {
            foreach ($b as $item) {
            }
            var_dump(xdebug_get_declared_vars());
        }
    }
    strings::fix_strings(array(1,2,3), array(4,5,6));
?>

返回:

array
  0 => string 'a' (length=1)
  1 => string 'b' (length=1)
  2 => string 'item' (length=4)

来自xdebug.org的示例

注意,该函数只返回函数xdebug_get_declared_vars()被调用的范围内的变量。

【讨论】:

    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2016-10-26
    • 2013-01-19
    相关资源
    最近更新 更多