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 }