2012-09-21 11 views
43

PHP 5 eingeführt DirectoryIterator und PHP 5.3 eingeführt FileSystemIterator.Unterschied zwischen DirectoryIterator und FileSystemIterator

FileSystemIterator erweitert DirectoryIterator, aber die Dokumentation kann nicht sagen, welche zusätzlichen Funktionen es bringt.

Können Sie den Unterschied zwischen DirectoryIterator und FileSystemIterator feststellen?

+1

Der Unterschied innerhalb der Teile ist, die * dokumentiert werden * auf der 'FileSystemIterator' Handbuch Seite, die sind * nicht * als geerbten Methoden aufgelistet (die Seite nicht auflistet diese sowieso, aber einige Klassen Seiten jene Liste, also nur einen Zeiger , alles, was Sie auf der Manpage * sehen, ist * der Unterschied [zumindest jetzt]). – hakre

Antwort

49

Dies geht aus der Spitze von meinem Kopf, wo ich irgendwie in der erwischt Änderungen vor PHP 5.3, die sich in 5.3 und später ändern sollten, bezüglich der SPL (StandardPHPLibrary) und Sachen, die auf die (schreckliche) PECL extensi verschoben werden sollten ons.

Die große Sache, die seit 5.3 geändert, war, dass die SPL eine Verlängerung wurde, die nicht mehr deaktiviert werden konnte, dass zur Liste der Standarderweiterungen

  • Added SPL unter Hinweis auf die changelog von 5,3 sehen, die nicht deaktiviert werden können . (Marcus)

so dass alle Phantasie Klassen wie DirectoryIterator oder SPLDoublyLinkedList waren jetzt ein Fix-Suite von Klassen, die mit PHP 5.3 kam.

Es gab viele Diskussionen darüber, dass der DirectoryIterator bei der Iteration über Dateien/Verzeichnisse und beim Verhalten, das nicht anonym genug war, mit dem verwendeten Dateisystem immer noch sehr ungeschickt war. Je nach Dateisystem (Windows NTFS/* nix EXTx) unterschieden sich die Ergebnisse, die der Iterator zurückgeben würde, von *nix Environments standardmäßig die Verzeichnisse dot und double dot (. und ..) als gültige Verzeichnisse. Diese Punktverzeichnisse könnten dann in der Schleife mit der Methode isDot() gefiltert werden.

$it = new DirectoryIterator(__DIR__); 
foreach ($it as $fileinfo) { 
    if (!$fileinfo->isDot()) 
    var_dump($fileinfo->getFilename()); 
} 

So wurde FilesystemIterator die neue übergeordnete Klasse in PHP 5.3, der auf seine Freisetzung vor war die DirectoryIterator (wo FilesystemIteratorDirectoryIterator erweitert dieses Verhalten austauschbare standardmäßig zu implementieren). Das Verhalten, oder führen die FilesystemIterator erzeugt, würde dann

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

Es ist eine gute Frage für alle verschiedenen Dateisysteme und austauschbar, ohne die Notwendigkeit eines Overhead in der Schleife gleich sein, warum sie nicht in der Dokumentation aktualisieren hat die für bemerken Benutzer auf die Tatsache, dass tatsächlich die FilesystemIterator der vorausging.

+0

+1: Vielen Dank für Ihre Informationen. Ich habe mich auch gefragt, aber Dokumentation ist immer hinter dem, was wirklich ist, und es macht keinen Sinn, dass eine API alle Design-Entscheidungswege dokumentiert, die ich vermute. – hakre

+4

Jeder kann die Dokumentation aktualisieren hier: https://edit.php.net/?project=PHP –

13

DirectoryIterator ist eine Erweiterung von SplFileInfo

während

FilesystemIterator ist eine Erweiterung von DirectoryIterator

und die beiden implementiert

Iterator , Traversable , SeekableIterator

FilesystemIterator Flaggen, die ihre beha beeinflusst hat bei der Arbeit welche Dateien, die sehr nützlich sein können, wie FOLLOW_SYMLINKS , SKIP_DOTS etc und dies macht den größten Teil seines Unterschieds.

können Sie voll Fahnen sehen bei FilesystemIterator predefined constants

Beispiel

$iterator = new DirectoryIterator(dirname(__FILE__)); 
foreach ($iterator as $fileinfo) { 
    var_dump($fileinfo->current()); // would return object(DirectoryIterator) 
} 

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