是否可以使用Reflection或其他方法访问SplObjectStorage
的数据?当我在其上使用print_r
时,我可以看到有一个包含所有数据的数组的私有属性$storage
,但我无法以任何方式使用Reflection访问它。是否有其他可能的解决方案来获取数据而不使用foreach
迭代集合?
答案 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)指定序列化对象时应该序列化的内容。
总结:反思内部类的“属性”通常不会成功,因为这些属性通常不存在。