Я смотрю учебник по SPL, и вот код, который меня смущает
<?php
$directory = new DirectoryIterator('common/images');
foreach ($directory as $file)
{
if($file->isFile())
$files[] = clone $file;
}
echo $files[1]->getFileName();
Если я не использую clone
Ключевое слово в цикле foreach, я не могу увидеть имя файла. Почему это так, когда я толкаю весь объект внутри $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
возвращает новый объект, который можно поместить в массив без клонирования.
на самом деле вы можете сделать это без clone
пока ваша логика находится внутри цикла foreach:
<?php
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
echo $fileinfo->getFilename() . "\n";
}
?>