DirectoryIterator和FileSystemIterator之间的区别

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

FileSystemIterator扩展DirectoryIterator ,但文档没有说明它带来了什么额外的function。

你能告诉DirectoryIteratorFileSystemIterator的区别吗?

这是我头顶的问题,在PHP 5.3之前我曾经遇到过5.3版本以后会发生变化的问题,这些问题涉及到SPL(StandardPHPLibrary)以及将被移到(可怕的)PECL扩展。

5.3以来的主要变化是SPL成为了一个不能被禁用的扩展,见5.3的更新日志 ,注意到

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

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

有很多的讨论,DirectoryIterator在迭代文件/目录和行为不够匿名的情况下仍然非常笨拙。 由于依赖于文件系统(Windows NTFS / * nix EXTx),迭代器将返回的结果与另一个不同,其中每个默认情况下的*nix环境总是将dot和double dot目录( ... )作为有效目录。 然后可以通过使用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之前。

DirectoryIteratorSplFileInfo的扩展

FilesystemIteratorDirectoryIterator的扩展

和这两个工具

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 }