PHP 5が導入されました DirectoryIterator 、およびPHP 5.3が導入されました FileSystemIterator 。
FileSystemIterator
はDirectoryIterator
を拡張しますが、ドキュメンテーションはそれがどのような追加機能をもたらすかを述べていません。
DirectoryIterator
とFileSystemIterator
の違いを教えてください。
これは頭の外に出て、SPL(StandardPHPLibrary)などに関して、PHP 5.3で5.3以降で変更される予定だった5.3より前の変更に気づきました。それは(恐ろしい)PECL拡張機能に移動する予定でした。
5.3以降に変更された主な点は、SPLが無効にできなくなった拡張機能になったことです。5.3の changelog を参照してください。
そのため、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
でした(ここでFilesystemIterator
は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
}