4

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

4

1 回答 1

5

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

当您在类上调用print_r(或var_dump)时看到的是调试信息。此信息是通过get_debug_info类的内部处理程序提供的。此处理程序允许内部类在不定义实际属性的情况下显示有意义的调试信息。

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

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

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

总而言之:反思内部类的“属性”通常不会奏效,因为这些属性通常实际上并不存在。

于 2013-04-03T13:41:22.630 回答