PHP 5引入了DirectoryIterator,PHP 5.3引入了FileSystemIterator。
FileSystemIterator
扩展了DirectoryIterator
,但文档未能说出它带来了哪些额外功能。
您能说出DirectoryIterator
和FileSystemIterator
之间的区别吗?
答案 0 :(得分:51)
这超出了我的头脑,我在PHP 5.3之前的变化中遇到了在5.3及更高版本中会发生变化的问题,关于SPL(StandardPHPLibrary)以及将要移动的内容(可怕的)PECL扩展。
自5.3以来发生的重大变化是,SPL成为了一个无法再被禁用的扩展,请参阅5.3的changelog注意到
所以像DirectoryIterator或SPLDoublyLinkedList这样的所有花哨的类现在都是PHP 5.3附带的修复类。
有很多讨论正在进行,DirectoryIterator在迭代文件/目录时的行为仍然非常笨拙,而且对于正在使用的文件系统的行为也不够匿名。因为依赖于文件系统(Windows NTFS / * nix EXTx),迭代器将返回的结果与另一个不同,其中每个默认的*nix
环境总是产生点和双点目录(.
和{{ 1}})作为有效目录。然后可以使用..
方法在循环中过滤这些点目录。
isDot()
所以$it = new DirectoryIterator(__DIR__);
foreach ($it as $fileinfo) {
if (!$fileinfo->isDot())
var_dump($fileinfo->getFilename());
}
成为PHP 5.3中的新父类,它在发布之前是FilesystemIterator
(其中DirectoryIterator
扩展FilesystemIterator
以实现此可互换默认情况下的行为)。 DirectoryIterator
生成的行为或结果将等于所有不同的文件系统并且可以互换而不需要循环中的任何开销
FilesystemIterator
这是一个很好的问题,为什么他们没有更新文档以便注意用户实际$it = new FilesystemIterator(__DIR__);
foreach ($it as $fileinfo) {
echo $fileinfo->getFilename() . "\n";
}
之前FilesystemIterator
的事实。
答案 1 :(得分:15)
DirectoryIterator
是SplFileInfo
而
FilesystemIterator
是DirectoryIterator
和两个工具
Iterator , Traversable , SeekableIterator
FilesystemIterator
有一些标志会影响它在处理哪些文件非常有用时的行为,例如FOLLOW_SYMLINKS , SKIP_DOTS etc
,这使得它的大部分区别。
您可以在FilesystemIterator predefined constants
看到完整的标记示例
$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
}