structures significado pilas listas estructuras estructura datos data php spl

php - significado - spl audio



Diferencia entre DirectoryIterator y FileSystemIterator (2)

Esto se me escapa por los pelos, cuando me quedé atrapado en los cambios previos a PHP 5.3 que iban a cambiar en 5.3 y posteriores, con respecto al SPL (StandardPHPLibrary) y las cosas que se iban a mover a ( horrible) extensiones PECL.

Lo más importante que cambió desde 5.3, fue que el SPL se convirtió en una extensión que ya no se podía deshabilitar, consulte el changelog de changelog de 5.3 que indica que

  • Se agregó SPL a la lista de extensiones estándar que no se pueden deshabilitar. (Marcus)

entonces todas las clases sofisticadas como DirectoryIterator o SPLDoublyLinkedList ahora eran un paquete de arreglos de clases que venía con PHP 5.3.

Hubo muchas discusiones sucediendo que el DirectoryIterator todavía era muy torpe al iterar sobre archivos / directorios y desde un comportamiento que no era lo suficientemente anónimo al sistema de archivos que se estaba utilizando. Porque dependiendo del sistema de archivos (Windows NTFS / * nix EXTx) los resultados que devolvería el iterador eran diferentes de los otros, donde los entornos *nix por defecto siempre daban como resultado directorios dot y double dot ( . Y .. ) como directorios válidos. Estos directorios de puntos se pueden filtrar en el ciclo utilizando el método isDot() .

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

Así FilesystemIterator convirtió en la nueva clase principal en PHP 5.3, que antes de su lanzamiento era DirectoryIterator (donde FilesystemIterator amplía DirectoryIterator para implementar este comportamiento intercambiable por defecto ). El comportamiento, o el resultado producido por FilesystemIterator , sería igual a todos los sistemas de archivos diferentes e intercambiables sin la necesidad de ningún gasto adicional en el ciclo

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

Es una buena pregunta por qué no actualizaron la documentación para notificar al usuario sobre el hecho de que en realidad el FilesystemIterator precedió al DirectoryIterator .

PHP 5 introdujo DirectoryIterator y PHP 5.3 introdujo FileSystemIterator .

FileSystemIterator amplía DirectoryIterator , pero la documentación no indica qué características adicionales aporta.

¿Puedes decir la diferencia entre DirectoryIterator y FileSystemIterator ?


DirectoryIterator es una extensión de SplFileInfo

mientras

FilesystemIterator es una extensión de DirectoryIterator

y los dos implementos

Iterator , Traversable , SeekableIterator

FilesystemIterator tiene indicadores que afectan sus comportamientos al trabajar con los archivos que pueden ser muy útiles, como FOLLOW_SYMLINKS , SKIP_DOTS etc y esto hace la mayor parte de su diferencia.

Puede ver indicadores completos en las constantes predefinidas de FilesystemIterator

Ejemplo

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

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