为什么在这里使用 clone 关键字
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
,你将把pointer/reference到变量$file
放入数组。
但是这个变量只在循环中使用,will/could在foreach
之后被销毁,因为它超出了范围。
这就是为什么您需要创建它的副本以放入数组并在循环后访问它的原因。
更新:实际上在这种情况下差异更深一点,请查看 this article。 DirectoryIterator
returns 相同的对象,这就是为什么你必须在迭代期间克隆(及其当前)状态,但是 FilesystemIterator
returns 新对象,可以放入数组没有克隆。
实际上你可以在没有 clone
的情况下完成它,而你的逻辑在 foreach 循环中:
<?php
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
echo $fileinfo->getFilename() . "\n";
}
?>
我正在看 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
,你将把pointer/reference到变量$file
放入数组。
但是这个变量只在循环中使用,will/could在foreach
之后被销毁,因为它超出了范围。
这就是为什么您需要创建它的副本以放入数组并在循环后访问它的原因。
更新:实际上在这种情况下差异更深一点,请查看 this article。 DirectoryIterator
returns 相同的对象,这就是为什么你必须在迭代期间克隆(及其当前)状态,但是 FilesystemIterator
returns 新对象,可以放入数组没有克隆。
实际上你可以在没有 clone
的情况下完成它,而你的逻辑在 foreach 循环中:
<?php
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
echo $fileinfo->getFilename() . "\n";
}
?>