通过Reflection访问SplObjectStorage数据

时间:2013-03-31 20:39:35

标签: php reflection spl

是否可以使用Reflection或其他方法访问SplObjectStorage的数据?当我在其上使用print_r时,我可以看到有一个包含所有数据的数组的私有属性$storage,但我无法以任何方式使用Reflection访问它。是否有其他可能的解决方案来获取数据而不使用foreach迭代集合?

1 个答案:

答案 0 :(得分:5)

无法通过Reflection访问$storage属性,因为它不存在

在课堂上致电print_r(或var_dump)时,您看到的是调试信息。此信息通过类的内部get_debug_info处理程序提供。此处理程序允许内部类显示有意义的调试信息,而无需定义实际属性。

与切线相关的问题显示以下代码段:

$r = new ReflectionClass('DateTime');
var_dump($r->hasProperty("timezone"));

上面的代码会告诉您该类没有timezone属性,即使您可以访问timezone个对象上的DateTime属性。原因是此属性不是声明的,它仅通过内部get_properties处理程序提供。再次,这是一个不能直接访问的属性,它只存在于a)提供有意义的调试输出和b)指定序列化对象时应该序列化的内容。

总结:反思内部类的“属性”通常不会成功,因为这些属性通常不存在。