1

当我使用 debug_backtrace 在 php 中检索堆栈跟踪时,我可以让它包含调用它的对象。能够看到对象的公共和私有属性对我来说非常有用,但是对象太大而无法使用。由于其中的某些变量包含其他对象,因此仅将其打印出来是不可行的-我尝试将 debug_print_backtrace 的输出写入文件,并且在发生故障并停止输出之前它达到了 23G。

我真正需要的是让这个输出限制自己进入一层深度 - 也就是说,输出对象的所有属性,但如果其中一个是另一个对象,而不是进一步列出我需要的所有属性是它的类名。

我知道我可以使用 get_object_vars 来获取对象的公共属性,但是如何获取私有属性呢?print_r、var_export、var_dump 等都是没用的,因为我无法阻止它们递归。

4

2 回答 2

0

您可以简单地使用 foreach 循环遍历对象,如下所示:

foreach($object as $property => $value)
   if (is_object($value))
      echo(get_class($value)."<br/>");
   else
      echo($property." => ".$value."<br/>");

但请记住,这不会显示私有属性。关于如何克服它的更广泛的解释可以在这里找到:http ://www.php.net/manual/en/language.oop5.iterations.php

于 2013-02-08T14:41:03.627 回答
0

您可以将对象转换为数组,然后遍历数组。私有和受保护的属性也可用,前缀是用空字节括起来的类名。您可以像这样测试这种行为:

测试:

class Test
{
    private $parent;
    public function __construct($parent) {
        $this->parent = $parent;
    }
}

$test = new Test(new Test(new Test(null)));
var_dump((array)$test);

输出:

array(1) {
  ["�Test�parent"]=>
  object(Test)#2 (1) {
    ["parent":"Test":private]=>
    object(Test)#3 (1) {
      ["parent":"Test":private]=>
      NULL
    }
  }
}

现在你有了一个数组,你可以做一个简单的foreach,剥离前缀并区分对象和其他变量:

foreach((array)$test as $name => $property) {
    if (ord($name[0]) === 0) {
        $name = substr($name, strrpos($name, "\x0")+1);
    }
    echo $name, ":";
    if (is_object($property)) {
        echo "(object)", get_class($property);
    } else {
        echo var_export($property, true);
    }
    echo "\n";
}

我会把漂亮的打印留给你。

于 2013-02-08T15:08:27.133 回答