PHP 5 представил DirectoryIterator , а PHP 5.3 представил FileSystemIterator .
FileSystemIterator расширяет DirectoryIterator , но в документации не указано, какие дополнительные функции он приносит.
Можете ли вы рассказать разницу между DirectoryIterator и FileSystemIterator ?
Это выходит из моей головы, где я как бы попался в изменения до PHP 5.3, которые будут меняться в 5.3 и более поздних версиях, касающихся SPL (StandardPHPLibrary) и других вещей, которые будут перемещены в ( ужасные) расширения PECL.
Главное, что изменилось с 5,3 года, состояло в том, что SPL стал расширением, которое больше не может быть отключено, см. Изменённый список 5.3, отмечая, что
поэтому все причудливые классы, такие как 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 }