通过反射访问SplObjectStorage数据


Access SplObjectStorage data via Reflection

是否可以使用反射或其他方法访问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)指定对象序列化时应该序列化的内容。

总而言之:反映内部类的"属性"通常是行不通的,因为这些属性通常实际上并不存在。

相关文章:
  • 没有找到相关文章