web-dev-qa-db-ja.com

DirectoryIteratorとFileSystemIteratorの違い

PHP 5が導入されました DirectoryIterator 、およびPHP 5.3が導入されました FileSystemIterator

FileSystemIteratorDirectoryIteratorを拡張しますが、ドキュメンテーションはそれがどのような追加機能をもたらすかを述べていません。

DirectoryIteratorFileSystemIteratorの違いを教えてください。

49
Benjamin

これは頭​​の外に出て、SPL(StandardPHPLibrary)などに関して、PHP 5.3で5.3以降で変更される予定だった5.3より前の変更に気づきました。それは(恐ろしい)PECL拡張機能に移動する予定でした。

5.3以降に変更された主な点は、SPLが無効にできなくなった拡張機能になったことです。5.3の changelog を参照してください。

  • 無効にできない標準拡張機能のリストに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でした(ここでFilesystemIteratorDirectoryIteratorデフォルトで交換可能な動作)。動作、または生成されるFilesystemIteratorは、すべてに等しくなりますループ内のオーバーヘッドを必要とせずに異なるファイルシステムと交換可能

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

実際にFilesystemIteratorDirectoryIteratorの前にあるという事実をユーザーに通知するためにドキュメントを更新しなかったのは良い質問です。

54
dbf

DirectoryIteratorSplFileInfoの拡張です

ながら

FilesystemIteratorDirectoryIteratorの拡張です

両方の実装

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
}
15
Baba