2012-09-21 7 views
43

PHP 5 introducido DirectoryIterator y PHP 5.3 introducido FileSystemIterator.Diferencia entre DirectoryIterator y FileSystemIterator

FileSystemIterator extiende DirectoryIterator, pero la documentación no indica qué funciones adicionales aporta.

¿Puedes notar la diferencia entre DirectoryIterator y FileSystemIterator?

+1

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

Respuesta

49

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.

+0

+1: Muchas gracias por compartir la información. También me pregunté, pero la documentación siempre está detrás de lo que realmente es y no tiene sentido que una API documente todas las rutas de decisión de diseño, supongo. – hakre

+4

Todos pueden actualizar los documentos aquí: https://edit.php.net/?project=PHP –

13

DirectoryIterator es una extensión de SplFileInfo

mientras

FilesystemIterator es una extensión de DirectoryIterator

y el tanto implementa

Iterator , Traversable , SeekableIterator

FilesystemIterator tiene banderas que afecta a su beha viors al trabajar qué archivos pueden ser muy útiles, como FOLLOW_SYMLINKS , SKIP_DOTS etc y esto hace la mayor parte de su diferencia.

Se puede ver banderas completo en FilesystemIterator predefined constants

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 
}