Ответ 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
.