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


Why use clone keyword here

我正在看一个SPL教程,这里是让我困惑的代码

<?php
$directory = new DirectoryIterator('common/images');
foreach ($directory as $file)
{
    if($file->isFile())
        $files[] = clone $file;
}
echo $files[1]->getFileName();

如果我在foreach循环中不使用clone关键字,我无法看到文件名。为什么当我在$files数组内推动整个对象时,会这样呢?

感谢

更新部分

而上面的代码我必须使用clone关键字。根据下面的答案,我们使用clone来创建对象而不是引用的副本。在这种情况下,这似乎不是一个有效的理由。考虑下面的示例,它不需要clone关键字,并按预期工作

<?php
$filesystem = new FilesystemIterator('common/images');
foreach ($filesystem as $file)
{
    $files[] = $file;
}
echo $files[0]->getFileName();

由于php5,操作符=创建了对对象的引用,因此没有clone,您将把指向变量$file的指针/引用放入数组。

但是这个变量只在循环中使用,并且可以在foreach之后被销毁,因为它超出了作用域。

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

更新:在这种情况下,实际上差异更大一些,请查看这篇文章。DirectoryIterator返回相同的对象,这就是为什么您必须在迭代期间克隆(使用其当前)状态,但FilesystemIterator返回新对象,可以将其放入数组而无需克隆。

实际上,当您的逻辑在foreach循环内时,您可以不使用clone:

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