为什么RecursiveIteratorIterator仅在循环中显示元素?

时间:2013-10-20 14:20:45

标签: php loops iterator

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
print_r($objects);   

仅输出

  

RecursiveIteratorIterator对象   (   )

但是如果你循环遍历同一个对象,比如

foreach($objects as $name => $object){
    echo "$name\n";
}

然后它显示所有文件和文件夹,如预期。

问题:为什么print_rvar_dump即使在创建对象后显示为空白?但该循环显示所有数据。 foreach是否在运行时循环遍历那些?这不是foreach正常工作的方式。事实上var_dumpprint_r对于几乎所有其他事物都说明了对象包含的所有内容,为什么不为这个呢?

1 个答案:

答案 0 :(得分:4)

foreach可以处理两种数据:Native array和实现任何Traversable接口的对象,即InteratorAggregateIterator。< / p>

如果实现这些接口,foreach循环将调用某些应该触发发出必要数据的方法。这意味着除非调用方法,否则数据可能不存在。因此,如果数据不存在,则无法转储它。如果您首先遍历对象然后尝试转储数据,则可能无法保存。

这一切都是故意的。一个好的对象通常在明确告知之前不会开始工作。特别是一个好的构造函数除了在内部存储参数然后完成之外没有做更多的工作。

因此,在您创建RecursiveDirectoryIterator之后,该对象仅保存了稍后要调查的路径。如果你转储它,你就会遇到从PHP内部实现的对象获取内部保存数据的问题。根本没有可以转储的PHP数据结构。

简而言之,底线:你可以转储在PHP核心或扩展中实现的对象,但是你只能检测它们的存在,而不是它们的内容。这会影响调试并且不是很好,但遗憾的是PHP的当前状态。