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

这仅输出

RecursiveIteratorIterator 对象 ( )

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

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

然后它会按预期显示所有文件和文件夹。

问题:为什么在创建 Objectprint_r之后var_dump仍然显示空白?但是那个循环显示了所有数据。是否foreach在运行时循环?这不是通常的foreach工作方式。此外,var_dump或者print_r几乎所有其他事物都说明了对象包含的所有内容,那么为什么不针对这个呢?

4

1 回答 1

4

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

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

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

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

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

于 2013-10-20T14:41:36.387 回答