forma correcta de establecer una clase FileInfo personalizado a un iterador
Pregunta
Estoy tratando de establecer una clase personalizada a un iterador a través de la setInfoClass
método:
Utilice este método para establecer una clase personalizada que se utilizará cuando GetFileInfo y getPathInfo se llaman. El nombre de clase pasado a este método debe derivarse de SplFileInfo.
Mi clase es así (ejemplo simplificado):
class MyFileInfo extends SplFileInfo
{
public $props = array(
'foo' => '1',
'bar' => '2'
);
}
El código iterador es la siguiente:
$rit = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/some/file/path/'),
RecursiveIteratorIterator::SELF_FIRST);
Desde RecursiveDirectoryIterator
es por herencia a través de DirectoryIterator
también un SplFileInfo
objeto, se proporciona el método setInfoClass
. No aparece en la lista en el manual, pero muestra reflexión que está ahí:
shell$ php --rc RecursiveDirectoryIterator
// ...
Method [ <internal:SPL, inherits SplFileInfo> public method setInfoClass ] {
- Parameters [1] {
Parameter #0 [ <optional> $class_name ]
}
}
Todo bien hasta aquí, pero cuando iterar sobre el directorio con
$rit->getInnerIterator()->setInfoClass('MyFileInfo');
foreach($rit as $file) {
var_dump( $file );
}
Me sale el siguiente resultado raro
object(MyFileInfo)#4 (3) {
["props"]=>UNKNOWN:0
["pathName":"SplFileInfo":private]=>string(49) "/some/file/path/someFile.txt"
["fileName":"SplFileInfo":private]=>string(25) "someFile.txt"
}
Así, mientras MyFileInfo
es recogido, no puedo acceder a sus propiedades. Si añado métodos personalizados, puedo invocarlos bien, pero las propiedades son desconocidos.
Si no definen la clase de información que el iterador, pero al objeto SplFileInfo (como se muestra en el ejemplo en el manual), se le dará el mismo resultado desconocido:
foreach($rit as $file) {
// $file is a SplFileInfo instance
$file->setInfoClass('MyFileInfo');
var_dump( $file->getFileInfo() );
}
Sin embargo, funcionará cuando lo haga
foreach($rit as $file) {
$file = new MyFileInfo($file);
var_dump( $file );
}
Por desgracia, el código que quiero usar esto en es algo más complicado y apila algunos más iteradores. La creación de la clase MyFileInfo como esto no es una opción.
Así que, ¿alguien sabe cómo conseguir este trabajo o por qué PHP se comporta de esta extraña?
Gracias.
Solución
No puedo decir exactamente por qué, pero funciona con
class MyFileInfo extends SplFileInfo
{
public $props;
public function __construct($filename) {
$this->props = array(
'foo' => '1',
'bar' => '2'
);
parent::__construct($filename);
}
}