DirectoryIterator 和 FileSystemIterator 之间的区别

2022-08-30 10:05:58

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

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

你能分辨出 和 之间的区别吗?DirectoryIteratorFileSystemIterator


答案 1

这超出了我的头顶,我有点陷入了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());
}

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

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

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


答案 2

DirectoryIterator是 的扩展SplFileInfo

FilesystemIterator是 的扩展DirectoryIterator

和两个实现

Iterator , Traversable , SeekableIterator

FilesystemIterator具有影响其行为的标志,这些标志在处理哪些文件时非常有用,例如,这使得它的大部分区别。FOLLOW_SYMLINKS , SKIP_DOTS etc

您可以在文件系统编辑器预定义常量中看到完整的标志

$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
}

推荐