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.

¿Fue útil?

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);
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top