Php 为什么在这里使用克隆关键字
我正在看一个关于SPL的教程,下面是让我困惑的代码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,操作符=创建了对对象的引用,所以在没有克隆的情况
<?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";
}
?>