DirectoryIterator和FileSystemIterator之间的区别

时间:2012-09-21 14:00:34

标签: php spl

PHP 5引入了DirectoryIterator,PHP 5.3引入了FileSystemIterator

FileSystemIterator扩展了DirectoryIterator,但文档未能说出它带来了哪些额外功能。

您能说出DirectoryIteratorFileSystemIterator之间的区别吗?

2 个答案:

答案 0 :(得分:51)

这超出了我的头脑,我在PHP 5.3之前的变化中遇到了在5.3及更高版本中会发生变化的问题,关于SPL(StandardPHPLibrary)以及将要移动的内容(可怕的)PECL扩展。

自5.3以来发生的重大变化是,SPL成为了一个无法再被禁用的扩展,请参阅5.3的changelog注意到

  • 将SPL添加到无法禁用的标准扩展列表中。 (马库斯)

所以像DirectoryIterator或SPLDoublyLinkedList这样的所有花哨的类现在都是PHP 5.3附带的修复类。

有很多讨论正在进行,Dir​​ectoryIterator在迭代文件/目录时的行为仍然非常笨拙,而且对于正在使用的文件系统的行为也不够匿名。因为依赖于文件系统(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)

DirectoryIteratorSplFileInfo

的扩展名

FilesystemIteratorDirectoryIterator

的扩展名

和两个工具

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
}