为什么递归迭代器迭代器仅在循环中显示元素


Why RecursiveIteratorIterator shows elements only in a loop?

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

这仅输出

递归迭代器迭代器对象 ( )

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

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

然后它像预期的那样显示所有文件和文件夹。

问:为什么即使在创建 Object 后,print_rvar_dump 仍显示该空白? 但该循环显示所有数据。foreach是否在运行时循环访问它们?这不是foreach通常的工作方式。此外,几乎所有其他事物的var_dumpprint_r都告诉了对象包含的所有内容,那么为什么不为这个呢?

foreach可以处理两种类型的数据:本机array和实现任何Traversable接口的对象,即InteratorAggregateIterator

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

这一切都是故意的。一个好的对象通常不会开始工作,直到明确地告诉这样做。特别是一个好的构造函数不会做比在内部存储参数然后完成更多的工作。

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

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