54

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

FileSystemIteratorextends DirectoryIterator,但文档没有说明它带来了哪些额外的功能。

你能说出 和 之间的区别DirectoryIteratorFileSystemIterator

4

2 回答 2

56

这超出了我的想象,我有点陷入了 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默认情况下,环境总是将点和双点目录(...)作为有效目录。然后可以使用该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";
}

这是一个很好的问题,为什么他们没有更新文档以通知用户实际上FilesystemIteratorDirectoryIterator.

于 2012-09-21T14:38:31.640 回答
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)
}

示例 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
}
于 2012-09-21T14:21:35.710 回答