繁体   English   中英

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

[英]How do I get a single level of object details from php?

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

我真正需要的是获取此输出以将自身限制在一个层次上,即输出该对象的所有属性,但是如果其中一个是另一个对象,则无需进一步列出我需要的所有属性是它的类名。

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

您可以简单地使用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/zh/language.oop5.iterations.php

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

测试:

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

我将漂亮的照片留给您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM