当我使用debug_backtrace在php中检索堆栈跟踪时,我可以让它包含从中调用的对象。能够看到对象的公共属性和私有属性对我来说非常有用,但是对象太大而无法使用。由于其中包含其他对象的一些变量,只需将其打印出来是不可行的 - 我尝试将debug_print_backtrace的输出写入文件,并在出现故障之前达到23G并停止输出。
我真正需要的是将此输出限制为深入一级 - 即输出对象的所有属性,但如果其中一个是另一个对象,而不是进一步列出该对象我需要的只是它的类名。
我知道我可以使用get_object_vars获取对象的公共属性,但是如何获取私有属性? print_r,var_export,var_dump等都没用,因为我无法阻止它们的递归。
答案 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";
}
我会把漂亮的印刷品留给你。