DirectoryIterator和FileSystemIterator之间的区别

Ben*_*min 51 php spl

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

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

你能告诉之间的区别DirectoryIteratorFileSystemIterator

dbf*_*dbf 56

这个问题超出了我的脑海,我在PHP 5.3之前的变化中遇到了变化,这些变化将在5.3及更高版本中发生变化,关于SPL(StandardPHPLibrary)以及将要移动到的东西(可怕的)PECL扩展.

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

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

所以像DirectoryIterator或SPLDoublyLinkedList这样的奇特类现在都是PHP 5.3附带的一组修复类.

有很多讨论正在进行,Dir​​ectoryIterator在迭代文件/目录时仍然非常笨拙,而且行为不够匿名到正在使用的文件系统.因为依赖于文件系统(Windows NTFS/*nix EXTx),迭代器将返回的结果与另一个不同,其中*nix每个默认环境总是将点和双点目录(...)作为有效目录.然后可以使用该isDot()方法在循环中过滤这些点目录.

$it = new DirectoryIterator(__DIR__);
foreach ($it as $fileinfo) {
  if (!$fileinfo->isDot())
    var_dump($fileinfo->getFilename());
}
Run Code Online (Sandbox Code Playgroud)

因此FilesystemIterator成为PHP 5.3中的新父类,它在发布之前是DirectoryIterator(默认情况下FilesystemIterator扩展DirectoryIterator为实现此可互换行为).然后,所FilesystemIterator产生的行为或结果将等于所有不同的文件系统并且可互换,而不需要循环中的任何开销

$it = new FilesystemIterator(__DIR__);
foreach ($it as $fileinfo) {
  echo $fileinfo->getFilename() . "\n";
}
Run Code Online (Sandbox Code Playgroud)

这是一个很好的问题,为什么他们没有更新文档以便注意到用户实际上在FilesystemIterator之前的事实DirectoryIterator.


Bab*_*aba 15

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)
}
Run Code Online (Sandbox Code Playgroud)

例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
}
Run Code Online (Sandbox Code Playgroud)