comportamiento incoherente DirectoryIterator + FilterIterator en PHP?
Pregunta
escribí un guión que está utilizando la clase FilterIterator que proviene de la biblioteca estándar de PHP (SPL) y consigo diferentes behabours cruzando versiones de PHP 5.x :( Aquí el aceptar () Función:
public function accept()
{
$current = $this->current();
print_r($current);
return true;
}
y aquí su salida para PHP 5.3.1:
DirectoryIterator Object
(
[pathName:SplFileInfo:private] => /Users/alex/Sites/dev/php/fscms/content/.
[fileName:SplFileInfo:private] => .
[glob:DirectoryIterator:private] =>
[subPathName:RecursiveDirectoryIterator:private] =>
)
DirectoryIterator Object
(
[pathName:SplFileInfo:private] => /Users/alex/Sites/dev/php/fscms/content/..
[fileName:SplFileInfo:private] => ..
[glob:DirectoryIterator:private] =>
[subPathName:RecursiveDirectoryIterator:private] =>
)
DirectoryIterator Object
(
[pathName:SplFileInfo:private] => /Users/alex/Sites/dev/php/fscms/content/.DS_Store
[fileName:SplFileInfo:private] => .DS_Store
[glob:DirectoryIterator:private] =>
[subPathName:RecursiveDirectoryIterator:private] =>
)
y aquí lo que me pasa con el mismo código en PHP 5.2.5
DirectoryIterator Object
(
)
DirectoryIterator Object
(
)
DirectoryIterator Object
(
)
Este último tiene permiso 755 en todos los archivos. ¿Cuál es hasta con dat?
Solución
Parece que este es en realidad estaba bien! Llamar a los métodos de la DirectoryIterator objetos aparentemente vacío obras. Los problemas que estaba teniendo eran en otro lugar y tuvo que ver con la clonación de estos objetos. Parece PHP 5.3 clones profunda, mientras que 5.2 por lo que no todas las referencias que te maten en cada iteración (o algo así). Es un feo, desorden-un documentado: PHP chupa
Otros consejos
De PHP.net:
- Nota: A partir de PHP 5.3.0 esta extensión ya no se puede desactivar y por lo tanto está siempre disponible.
Es posible que su configuración de PHP 5.2.5 es de alguna manera incompleta / mal? ¿Se ha configurado el error de registro de leve a mostrar advertencias? Si no es así, ajustar y ejecutar su código de nuevo para ver si su lanzando advertencias ...