如何从php获取单一级别的对象详细信息?
当我使用debug_backtrace在php中检索stacktrace时,我可以让它包含调用它的对象。能够同时看到对象的公共和私有属性对我来说非常有用,但是对象太大,无法使用。由于其中的一些变量包含其他对象,简单地将其打印出来是不可行的——我尝试将debug_print_backtrace的输出写入一个文件,在出现故障并停止输出之前,它达到23G 我真正需要的是,让这个输出将自己限制在一个层次的深度——也就是说,输出对象的所有属性,但是如果其中一个是另一个对象,而不是进一步列出一个,我需要的只是它的类名如何从php获取单一级别的对象详细信息?,php,class,object,stack-trace,Php,Class,Object,Stack Trace,当我使用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不会关心这一点;)嗯,够近了。我实际使用的解决方案似乎已被删除,但您可以在此处看到: