通过反射访问SplObjectStorage数据

4

是否有可能使用反射或其他方法访问SplObjectStorage的数据?当我使用print_r时,我可以看到有一个包含所有数据的私有属性$storage和一个数组,但是我无法以任何方式使用反射来访问它。是否有其他可能的解决方案可以在不使用foreach循环遍历集合的情况下获取数据?


我不相信会有问题(如果愿意,可以查看代码),但是迭代有什么问题吗? - Fabian Schmengler
@fab 我不想影响对象的状态(改变迭代索引等)。无论如何,现在我会使用clone... - Smasty
1个回答

5
通过反射访问$storage属性是不可能的,因为它不存在
当您在类上调用print_r(或var_dump)时,您看到的是调试信息。这些信息是通过类的内部get_debug_info处理程序提供的。此处理程序允许内部类显示有意义的调试信息,而无需定义实际属性。
以下代码段显示了一个相关问题:
$r = new ReflectionClass('DateTime');
var_dump($r->hasProperty("timezone"));

上面的代码将告诉您该类没有timezone属性,即使您可以访问DateTime对象上的timezone属性。原因是此属性未被声明,它仅通过内部get_properties处理程序提供。再次强调,此属性不是设计用于直接访问的属性,它只存在于a)提供有意义的调试输出和b)指定在序列化对象时应序列化的内容。
简而言之:反射内部类的“属性”通常不起作用,因为这些属性通常实际上并不存在。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接