【问题标题】:Access SplObjectStorage data via Reflection通过反射访问 SplObjectStorage 数据
【发布时间】:2013-03-31 20:39:34
【问题描述】:

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

【问题讨论】:

  • 我不这么认为(have a look at the code 如果你愿意的话),但是迭代有什么问题?
  • @fab 我不想影响对象的状态(更改迭代索引等)。无论如何,我现在将使用clone...

标签: php reflection spl


【解决方案1】:

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

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

一个切线相关的问题显示为以下 sn-p:

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

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

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

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    相关资源
    最近更新 更多