54

PHP 5ではDirectoryIteratorが導入され、PHP5.3ではFileSystemIteratorが導入されました。

FileSystemIterator拡張DirectoryIteratorしますが、ドキュメントには、それがもたらす追加機能については記載されていません。

DirectoryIteratorとの違いがわかりますFileSystemIteratorか?

4

2 に答える 2

56

これは頭​​から離れてしまいます。そこでは、5.3以降で変更される予定のPHP 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そのため、PHP 5.3の新しい親クラスになりました。これは、リリース前は(DirectoryIteratorextendsFilesystemIterator、デフォルトでこの互換性のある動作DirectoryIteratorを実装するために拡張されています)でした。その場合、動作または生成された結果は、すべての異なるファイルシステムと等しくなり、ループ内のオーバーヘッドを必要とせずに交換可能になります。FilesystemIterator

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

FilesystemIteratorが実際に先行しているという事実についてユーザーに通知するために、なぜ彼らがドキュメントを更新しなかったのかは良い質問DirectoryIteratorです。

于 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 に答える