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

如何从php获取单一级别的对象详细信息?,php,class,object,stack-trace,Php,Class,Object,Stack Trace,当我使用debug_backtrace在php中检索stacktrace时,我可以让它包含调用它的对象。能够同时看到对象的公共和私有属性对我来说非常有用,但是对象太大,无法使用。由于其中的一些变量包含其他对象,简单地将其打印出来是不可行的——我尝试将debug_print_backtrace的输出写入一个文件,在出现故障并停止输出之前,它达到23G 我真正需要的是,让这个输出将自己限制在一个层次的深度——也就是说,输出对象的所有属性,但是如果其中一个是另一个对象,而不是进一步列出一个,我需要的只

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

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


我知道我可以使用get_object_vars来获取对象的公共属性,但是如何获取私有属性呢?打印、变量导出、变量转储等都是无用的,因为我无法阻止它们递归

只需使用foreach循环即可遍历对象,如下所示:

foreach($object as $property => $value)
   if (is_object($value))
      echo(get_class($value)."<br/>");
   else
      echo($property." => ".$value."<br/>");
foreach($objectas$property=>$value)
如果(是对象($value))
echo(获取类($value)。“
”; 其他的 echo($property.=>“$value.
”);
但请记住,这不会显示私有属性。
关于如何克服这个问题的更广泛的解释可以在这里找到:

您可以将对象强制转换为数组,然后在数组上迭代。私有和受保护属性也可用,前缀为类名,并用空字节括起来。您可以这样测试这种行为:

测试:

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
    }
  }
}
输出:

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

我将把漂亮的打印留给您。

反射可能很有用:类似于?的链接还显示了这不可靠的原因。该对象可能是一个迭代器,并且做的事情可能与在迭代时生成其属性完全不同。这确实是正确的-它可能还有一个已定义的uu toArray()方法,我认为这将导致
foreach
产生不同于预期的结果。PHP没有
\uu toArray()
(但是?),只有
\uu toString()
.Blargh。。。愚蠢的我认为事情是理所当然的:D(提示我检查我的代码中到底有什么uu-toArray以及它为什么工作):D这里有一些框架可以使用toArray或u-toArray,如果它们存在的话,但是foreach不会关心这一点;)嗯,够近了。我实际使用的解决方案似乎已被删除,但您可以在此处看到: