Php DirectoryIterator和FileSystemEmitter之间的区别

Php DirectoryIterator和FileSystemEmitter之间的区别,php,spl,Php,Spl,介绍了PHP5和PHP5.3 FileSystemIterator扩展了directoryinterator,但文档没有说明它带来了哪些额外功能 你能分辨出directoryinterator和filesystememitter之间的区别吗?directoryinterator是SplFileInfo 当 FilesystemIterator是directoryinterator 而这两种方法都实现了 迭代器,可遍历,SeekableIterator filesystememitter具有一些标

介绍了PHP5和PHP5.3

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


你能分辨出
directoryinterator
filesystememitter
之间的区别吗?

directoryinterator
SplFileInfo

FilesystemIterator
directoryinterator

而这两种方法都实现了

迭代器,可遍历,SeekableIterator

filesystememitter
具有一些标志,这些标志会影响其在处理哪些文件时的行为,这些文件可能非常有用,例如
遵循符号链接、跳过点等
,这使得它的区别很大

您可以在上看到完整的标志

范例

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

这超出了我的想象,在PHP5.3之前,我有点陷入了5.3和更高版本将要发生的变化中,关于SPL(StandardPHPLibrary)和将要移动到(可怕的)PECL扩展的东西

自5.3版以来,主要的变化是SPL成为了一个不能再被禁用的扩展,请参见5.3版

  • 将SPL添加到无法禁用的标准扩展列表中。 (马库斯)
因此,像DirectoryIterator或SPLDoublyLinkedList这样的所有高级类现在都是PHP5.3附带的一套修复类

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

$it = new DirectoryIterator(__DIR__);
foreach ($it as $fileinfo) {
  if (!$fileinfo->isDot())
    var_dump($fileinfo->getFilename());
}
因此,
FilesystemIterator
成为PHP5.3中的新父类,在发布之前是
DirectoryIterator
(其中
FilesystemIterator
扩展了
DirectoryIterator
,默认情况下实现了这种可互换的行为)。然后,
文件系统发射器
产生的行为或结果将等于所有不同的文件系统,并且可以互换,而不需要循环中的任何开销

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

这是一个很好的问题,为什么他们没有更新文档来通知用户,
filesystememitter
实际上在
directoryinterator
之前

+1:非常感谢您分享我们的见解。我也很好奇,但文档总是隐藏在真实的背后,API记录所有设计决策路径是没有意义的。@AndréFiedler True,每个人都可以更新文档,但不是每个人都应该更新。这些更改是基于核心开发团队做出的决定,从任何角度来看,都应该反映在任何适当的文档中。区别在于
FileSystemEmitter
手册页面上记录的未列为继承方法的部分(该页面没有列出这些内容,但有些类页面列出了这些内容,所以只需一个指针,您在手册页面上看到的只是不同之处[至少现在])。参考这篇提供更多信息的文章:。@GrasDouble感谢您提供的链接!摘录本文的要点并给出答案会很有趣!