web-dev-qa-db-fra.com

Différence entre DirectoryIterator et FileSystemIterator

PHP 5 introduit DirectoryIterator , et PHP 5.3 introduit FileSystemIterator .

FileSystemIterator étend DirectoryIterator, mais la documentation ne dit pas quelles fonctionnalités supplémentaires elle apporte.

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

49
Benjamin

Cela sort du haut de ma tête, où je me suis en quelque sorte retrouvé pris dans les changements avant PHP 5.3 qui allaient changer en 5.3 et plus tard, concernant le SPL (StandardPHPLibrary) et tout ça) qui allaient être déplacés vers les (horribles) extensions PECL.

La principale chose qui a changé depuis la 5.3, c'est que le SPL est devenu une extension qui ne pouvait plus être désactivée, voir le changelog de 5.3 notant que

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

donc toutes les classes fantaisies comme DirectoryIterator ou SPLDoublyLinkedList étaient maintenant une suite de classes fixe fournie avec PHP 5.3.

Il y avait beaucoup de discussions en cours que 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 retournerait étaient différents d'un autre, où les environnements *nix Par défaut entraînaient toujours les répertoires point et double point (. Et ..) En tant que répertoires valides. Ces répertoires de points pourraient ensuite être filtrés dans la boucle à l'aide de la méthode isDot().

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

Donc FilesystemIterator est devenu la nouvelle classe parente dans PHP 5.3, qui avant sa sortie était le DirectoryIterator (où FilesystemIterator s'étend DirectoryIterator pour implémenter ce comportement interchangeable par défaut ). Le comportement, ou le résultat FilesystemIterator produit, serait alors égal à tous différents systèmes de fichiers et interchangeables sans besoin de surcharge dans la boucle

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

C'est une bonne question pourquoi ils n'ont pas mis à jour la documentation pour avoir remarqué à l'utilisateur le fait qu'en fait le FilesystemIterator a précédé le DirectoryIterator.

54
dbf

DirectoryIterator est une extension de SplFileInfo

tandis que

FilesystemIterator est une extension de DirectoryIterator

et les deux instruments

Iterator , Traversable , SeekableIterator

FilesystemIterator a des indicateurs qui affectent ses comportements lors du travail sur les fichiers qui peuvent être très utiles tels que FOLLOW_SYMLINKS , SKIP_DOTS etc et cela fait la plupart de sa différence.

Vous pouvez voir les indicateurs complets sur Constantes prédéfinies 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
}
15
Baba