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

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

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

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

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

Главное, что изменилось с 5,3 года, состояло в том, что SPL стал расширением, которое больше не может быть отключено, см. Изменённый список 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 расширяет DirectoryIterator для реализации этого взаимозаменяемого поведения по умолчанию ). Поведение или результат, созданный производителем FilesystemIterator , тогда будет равно всем различным файловым системам и взаимозаменяемым без необходимости каких-либо накладных расходов в цикле

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

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

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

в то время как

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 }