DirectoryIterator和FileSystemIterator之间的区别
PHP 5引入了DirectoryIterator ,而PHP 5.3引入了FileSystemIterator 。
FileSystemIterator
扩展DirectoryIterator
,但文档没有说明它带来了什么额外的function。
你能告诉DirectoryIterator
和FileSystemIterator
的区别吗?
这是我头顶的问题,在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
之前。
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 }