【问题标题】:Why RecursiveIteratorIterator shows elements only in a loop?为什么 RecursiveIteratorIterator 只在循环中显示元素?
【发布时间】:2013-10-28 23:54:32
【问题描述】:
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
print_r($objects);   

仅输出

RecursiveIteratorIterator 对象 ( )

但是如果你像循环一样遍历同一个对象

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

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

问题: 为什么 print_rvar_dump 在创建 Object 后仍显示空白?但是那个循环显示了所有数据。 foreach 是否在运行时循环遍历那些? foreach 通常不是这样工作的。此外,var_dumpprint_r 几乎所有其他事物都说明了对象包含的所有内容,那么为什么不针对这个呢?

【问题讨论】:

    标签: php loops iterator


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-01-08
      • 2017-09-18
      • 2015-06-17
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 2021-08-31
      相关资源
      最近更新 更多