是否可以使用反射或其他方法访问SplObjectStorage
的数据?当我在上面使用print_r
时,我可以看到有一个包含所有数据的数组的私有属性$storage
,但我不能以任何方式使用反射访问它。是否有其他可能的解决方案来获取数据,而无需使用foreach
迭代集合?
通过反射访问$storage
属性是不可能的,因为它不存在。
在类上调用print_r
(或var_dump
)时看到的是调试信息。这些信息是通过类的内部get_debug_info
处理程序提供的。此处理程序允许内部类在不定义实际属性的情况下显示有意义的调试信息。
$r = new ReflectionClass('DateTime');
var_dump($r->hasProperty("timezone"));
上面的代码将告诉您类没有timezone
属性,尽管您可以访问DateTime
对象上的timezone
属性。原因是该属性没有声明,它只通过内部get_properties
处理程序提供。同样,这个属性不是设计用来直接访问的,它的存在只是为了a)提供有意义的调试输出和b)指定对象序列化时应该序列化的内容。
总而言之:反映内部类的"属性"通常是行不通的,因为这些属性通常实际上并不存在。