Php 为什么在这里使用克隆关键字

Php 为什么在这里使用克隆关键字,php,spl,Php,Spl,我正在看一个关于SPL的教程,下面是让我困惑的代码 <?php $directory = new DirectoryIterator('common/images'); foreach ($directory as $file) { if($file->isFile()) $files[] = clone $file; } echo $files[1]->getFileName(); 由于php5,操作符=创建了对对象的引用,所以在没有克隆的情况

我正在看一个关于SPL的教程,下面是让我困惑的代码

<?php

$directory = new DirectoryIterator('common/images');

foreach ($directory as $file)
{
    if($file->isFile())
        $files[] = clone $file;
}

echo $files[1]->getFileName();

由于php5,操作符
=
创建了对对象的引用,所以在没有
克隆的情况下,您将把变量
$file
的指针/引用放入数组中

但该变量仅在循环内使用,并且将/可能在
foreach
之后销毁,因为它超出了范围

这就是为什么您需要创建它的副本以放入数组中,并在循环后访问它


更新:事实上,这种情况下的差异更深了一点,请查看
DirectoryIterator
返回相同的对象,这就是为什么您必须在迭代期间克隆(其当前)状态,但
FileSystemEmitter
返回新对象,可以将其放入数组中而无需克隆。

实际上,当您的逻辑在foreach循环中时,您可以不使用
clone
执行此操作:

<?php
  $dir = new DirectoryIterator(dirname(__FILE__));
  foreach ($dir as $fileinfo) {
    echo $fileinfo->getFilename() . "\n";
  }
?>


我知道,问题是将其放入数组。尽管我理解您的逻辑。但当我把整个$file变量放入$files时。这里不是不需要复制或引用,而是一个包含$file对象的新变量。您能看看更新的部分吗?经过更新后的例子,我没有接受你的答案。
<?php
  $dir = new DirectoryIterator(dirname(__FILE__));
  foreach ($dir as $fileinfo) {
    echo $fileinfo->getFilename() . "\n";
  }
?>