2015-08-02 2 views
1

Я смотрю учебник SPL и вот код, который меня смущаетЗачем использовать клон ключевое слово здесь

<?php 

$directory = new DirectoryIterator('common/images'); 

foreach ($directory as $file) 
{ 
    if($file->isFile()) 
     $files[] = clone $file; 
} 

echo $files[1]->getFileName(); 

Если я не использую clone ключевое слово в цикле Еогеасп, я не могу видеть имя файла. Почему это так, когда я нажимаю весь объект внутри массива $files.

Благодаря

ОБНОВЛЕНО Часть

Хотя приведенный выше код я должен использовал clone ключевое слово. На основании нижеприведенного ответа мы используем clone, чтобы создать копию объекта без ссылки. В этом случае это не является веской причиной. Рассмотрим следующий пример, который не нуждается клон ключевого слова и работает, как ожидалось

<?php 

$filesystem = new FilesystemIterator('common/images'); 
foreach ($filesystem as $file) 
{ 
    $files[] = $file; 
} 

echo $files[0]->getFileName(); 

ответ

3

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

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

Именно поэтому вам необходимо создать копию его для размещения в массиве и получить доступ к нему после цикла.

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

+0

Хотя я понимаю вашу логику. Но поскольку я помещал целую переменную $ file в $ files. Разве это не так, как будто нам не нужна копия или ссылка здесь, а фактически новая переменная, которая содержит объект $ file. –

+0

вы можете посмотреть обновленную часть? Я не принял ваш ответ после прохождения этого обновленного примера. –

+0

@RaheelKhan Я обновил его –

0

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

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

sample from php.net manual

+0

Я знаю, проблема заключалась в том, чтобы помещать его в массив. –