如何从php获取单个级别的对象详细信息?

时间:2013-02-08 14:21:47

标签: php class object stack-trace

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

我真正需要的是将此输出限制为深入一级 - 即输出对象的所有属性,但如果其中一个是另一个对象,而不是进一步列出该对象我需要的只是它的类名。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

<强>测试

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";
}

我会把漂亮的印刷品留给你。