Esto sale de la parte superior de la cabeza, donde en cierto modo me vi envuelto en el cambios anteriores a PHP 5.3 que iban a cambiar en 5.3 y posteriores, con respecto al SPL (StandardPHPLibrary) y cosas que iban a trasladarse a la (horrible) extensión de PECL ons.
La principal cosa que ha cambiado desde 5.3, fue que la presión sonora se convirtió en una extensión que no pudo ser desactivado más, ver la changelog de 5,3 señalar que
- Agregado SPL a la lista de extensiones estándar que no se puede desactivar . (Marcus)
por lo que todas las clases de lujo como DirectoryIterator o SPLDoublyLinkedList eran ahora un conjunto fijo de clases que viene 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 el iterador devolvería eran diferentes de los otros, donde los entornos *nix
por defecto siempre daban como resultado directorios dot 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
se convirtió en la nueva clase padre en PHP 5.3, que antes de su lanzamiento era el DirectoryIterator
(donde FilesystemIterator
se extiende DirectoryIterator
para implementar este comportamiento intercambiable de forma predeterminada). El comportamiento, o como resultado de la FilesystemIterator
producido, sería entonces igual a todos los sistemas de ficheros diferentes e intercambiables sin necesidad de ningún tipo de gastos en el bucle
$it = new FilesystemIterator(__DIR__);
foreach ($it as $fileinfo) {
echo $fileinfo->getFilename() . "\n";
}
Es una buena pregunta de por qué no actualizar la documentación para darse cuenta de la usuario sobre el hecho de que en realidad el FilesystemIterator
precedió al DirectoryIterator
.
La diferencia está dentro de las partes * documentadas * en la página del manual 'FileSystemIterator' que * no * figuran como métodos heredados (esa página no las incluye, pero algunas páginas de clase las incluyen, por lo que solo un puntero , todo lo que ve en la página del manual * es * la diferencia [al menos en este momento]). – hakre