51 votes

Différence entre DirectoryIterator et FileSystemIterator

Introduction de PHP 5 Itérateur de répertoire et PHP 5.3 a introduit FileSystemIterator .

FileSystemIterator étend DirectoryIterator mais la documentation ne précise pas quelles sont les fonctionnalités supplémentaires qu'il apporte.

Pouvez-vous faire la différence entre DirectoryIterator et FileSystemIterator ?

56voto

dbf Points 1330

Je me suis retrouvé pris dans les changements antérieurs à PHP 5.3 qui allaient changer dans les versions 5.3 et suivantes, concernant la SPL (StandardPHPLibrary) et d'autres choses qui allaient être déplacées vers les (horribles) extensions PECL.

La principale chose qui a changé depuis la version 5.3 est que la SPL est devenue une extension qui ne peut plus être désactivée. journal des modifications de 5,3 en notant que

  • Ajout de SPL à la liste des extensions standard qui ne peuvent pas être désactivées. (Marcus)

Ainsi, toutes les classes fantaisistes comme DirectoryIterator ou SPLDoublyLinkedList sont maintenant une suite de classes fixes fournies avec PHP 5.3.

Il y avait beaucoup de discussions sur le fait que le DirectoryIterator était encore très maladroit dans l'itération sur les fichiers/répertoires et d'un comportement pas assez anonyme au système de fichiers utilisé. Parce que selon le système de fichiers (Windows NTFS / *nix EXTx), les résultats que l'itérateur retournait étaient différents d'un autre, où *nix par défaut, résulte toujours les répertoires point et double point ( . et .. ) comme des répertoires valides. Ces répertoires à points peuvent ensuite être filtrés dans la boucle en utilisant la fonction isDot() méthode.

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

Alors FilesystemIterator est devenue la nouvelle classe parente en PHP 5.3, qui avant sa sortie était la classe DirectoryIterator (où FilesystemIterator étend DirectoryIterator pour mettre en œuvre cette comportement interchangeable par défaut ). Le comportement, ou le résultat que le FilesystemIterator produite, serait alors égale à tous les différents systèmes de fichiers et interchangeable sans qu'il soit nécessaire d'ajouter une surcharge dans la boucle.

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

C'est une bonne question de savoir pourquoi ils n'ont pas mis à jour la documentation pour informer l'utilisateur sur le fait qu'en fait, la fonction FilesystemIterator a précédé le DirectoryIterator .

15voto

Baba Points 49157

DirectoryIterator est une extension de SplFileInfo

tandis que

FilesystemIterator est une extension de DirectoryIterator

et les deux mettent en œuvre

Iterator , Traversable , SeekableIterator

FilesystemIterator a des drapeaux qui affectent ses comportements lors du travail avec des fichiers qui peuvent être très utiles tels que FOLLOW_SYMLINKS , SKIP_DOTS etc et c'est ce qui fait l'essentiel de sa différence.

Vous pouvez voir les drapeaux complets à Constantes prédéfinies de FilesystemIterator

Exemple

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X