Подтвердить что ты не робот

Разница между DirectoryIterator и FileSystemIterator

PHP 5 представил DirectoryIterator, а PHP 5.3 представил FileSystemIterator.

FileSystemIterator extends DirectoryIterator, но в документации не указано, какие дополнительные функции он приносит.

Можете ли вы рассказать разницу между DirectoryIterator и FileSystemIterator?

4b9b3361

Ответ 1

Это выходит из моей головы, где я как бы попался в изменения до PHP 5.3, которые будут меняться в 5.3 и более поздних версиях, в отношении SPL (StandardPHPLibrary) и других вещей, которые будут перемещены к (ужасным) расширениям PECL.

Главное, что изменилось с 5.3, состояло в том, что SPL стал расширением, которое больше не может быть отключено, см. changelog 5.3 отмечая, что

  • Добавлен SPL в список стандартных расширений, которые нельзя отключить. (Марк)

поэтому все причудливые классы, такие как DirectoryIterator или SPLDoublyLinkedList, теперь представляют собой набор исправлений классов, поставляемых с PHP 5.3.

Было много дискуссий о том, что DirectoryIterator все еще был очень неуклюжим в итерации по файлам/каталогам и от поведения, недостаточно анонимного для используемой файловой системы. Поскольку в зависимости от файловой системы (Windows NTFS/* nix EXTx) результаты, возвращаемые итератором, были отличными от других, где *nix окружения по умолчанию всегда приводили точечные и двухточечные каталоги (. и ..) как действительные каталоги. Эти точечные каталоги могут быть затем отфильтрованы в цикле с помощью метода isDot().

$it = new DirectoryIterator(__DIR__);
foreach ($it as $fileinfo) {
  if (!$fileinfo->isDot())
    var_dump($fileinfo->getFilename());
}

Итак, FilesystemIterator стал новым родительским классом в PHP 5.3, который до его выпуска был DirectoryIterator (где FilesystemIterator extends DirectoryIterator для реализации этого взаимозаменяемого поведения по умолчанию). Поведение или результат, созданный FilesystemIterator, тогда будет равным всем различным файловым системам и взаимозаменяемым без необходимости каких-либо служебных расходов в цикле

$it = new FilesystemIterator(__DIR__);
foreach ($it as $fileinfo) {
  echo $fileinfo->getFilename() . "\n";
}

Хороший вопрос, почему они не обновили документацию, заметив пользователя о том, что на самом деле FilesystemIterator предшествовал DirectoryIterator.

Ответ 2

DirectoryIterator является расширением SplFileInfo

while

FilesystemIterator является расширением DirectoryIterator

и оба орудия

Iterator , Traversable , SeekableIterator

FilesystemIterator имеет флаги, которые влияют на его поведение при работе с файлами, которые могут быть очень полезными, например FOLLOW_SYMLINKS , SKIP_DOTS etc, и это делает большую часть его разницы.

Вы можете видеть полные флаги в предопределенные константы FilesystemIterator

Пример

$iterator = new DirectoryIterator(dirname(__FILE__));
foreach ( $iterator as $fileinfo ) {
    var_dump($fileinfo->current()); // would return object(DirectoryIterator)
}

Пример 2

$iterator = new FilesystemIterator(__DIR__, FilesystemIterator::CURRENT_AS_PATHNAME);
foreach ( $iterator as $fileinfo ) {
    var_dump($iterator->current()) . "\n"; // Would return full path eg /www/examples/example.php
}