PHP 5ではDirectoryIteratorが導入され、PHP5.3ではFileSystemIteratorが導入されました。
FileSystemIterator
拡張DirectoryIterator
しますが、ドキュメントには、それがもたらす追加機能については記載されていません。
DirectoryIterator
との違いがわかりますFileSystemIterator
か?
PHP 5ではDirectoryIteratorが導入され、PHP5.3ではFileSystemIteratorが導入されました。
FileSystemIterator
拡張DirectoryIterator
しますが、ドキュメントには、それがもたらす追加機能については記載されていません。
DirectoryIterator
との違いがわかりますFileSystemIterator
か?
これは頭から離れてしまいます。そこでは、5.3以降で変更される予定のPHP 5.3より前の変更に、SPL(StandardPHPLibrary)や(恐ろしい)PECL拡張。
5.3以降に変更された主な点は、SPLが拡張機能になり、無効にできなくなったことです。5.3の変更ログを参照してください。
そのため、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の新しい親クラスになりました。これは、リリース前は(DirectoryIterator
extendsFilesystemIterator
は、デフォルトでこの互換性のある動作DirectoryIterator
を実装するために拡張されています)でした。その場合、動作または生成された結果は、すべての異なるファイルシステムと等しくなり、ループ内のオーバーヘッドを必要とせずに交換可能になります。FilesystemIterator
$it = new FilesystemIterator(__DIR__);
foreach ($it as $fileinfo) {
echo $fileinfo->getFilename() . "\n";
}
FilesystemIterator
が実際に先行しているという事実についてユーザーに通知するために、なぜ彼らがドキュメントを更新しなかったのかは良い質問DirectoryIterator
です。
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
}