Зачем использовать ключевое слово клон здесь

Я смотрю учебник по 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();

1

Решение

Начиная с php5, оператор = создает ссылку на объект, поэтому без clone вы поместите указатель / ссылку на переменную $file в массив.

Но эта переменная используется только внутри цикла и будет / может быть уничтожена после foreachпотому что это выходит за рамки.

Вот почему вам нужно создать его копию, чтобы поместить в массив и иметь доступ к нему после цикла.

ОБНОВЛЕНИЕ: На самом деле разница немного глубже в этом случае, проверьте Эта статья. DirectoryIterator возвращает тот же объект, поэтому вы должны клонировать (с его текущим) состояние во время итерации, но FilesystemIterator возвращает новый объект, который можно поместить в массив без клонирования.

3

Другие решения

на самом деле вы можете сделать это без clone пока ваша логика находится внутри цикла foreach:

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

образец из руководства php.net

0

По вопросам рекламы [email protected]