Maneira correta de definir uma classe FileInfo personalizada para um iterador

StackOverflow https://stackoverflow.com/questions/2572707

  •  24-09-2019
  •  | 
  •  

Pergunta

Estou tentando definir uma classe personalizada para um iterador através do setInfoClass método:

Use este método para definir uma classe personalizada que será usada quando o getFileInfo e o getPathinfo forem chamados. O nome da classe passado para este método deve ser derivado do splfileInfo.

Minha aula é assim (exemplo simplificado):

class MyFileInfo extends SplFileInfo
{
    public $props = array(
        'foo' => '1',
        'bar' => '2'
    );
}

O código do iterador é o seguinte:

$rit = new RecursiveIteratorIterator(
           new RecursiveDirectoryIterator('/some/file/path/'),
           RecursiveIteratorIterator::SELF_FIRST);

Desde RecursiveDirectoryIterator é por herança através DirectoryIterator também um SplFileInfo objeto, ele fornece o setInfoClass método. Não está listado no manual, mas a reflexão mostra que está lá:

shell$ php --rc RecursiveDirectoryIterator
// ...
Method [ <internal:SPL, inherits SplFileInfo> public method setInfoClass ] {  
  - Parameters [1] {
    Parameter #0 [ <optional> $class_name ]
  }
}

Tudo bem até aqui, mas quando se itera sobre o diretório com

$rit->getInnerIterator()->setInfoClass('MyFileInfo');
foreach($rit as $file) {
    var_dump( $file );
}

Eu recebo o seguinte resultado estranho

object(MyFileInfo)#4 (3) {
  ["props"]=>UNKNOWN:0
  ["pathName":"SplFileInfo":private]=>string(49) "/some/file/path/someFile.txt"
  ["fileName":"SplFileInfo":private]=>string(25) "someFile.txt"
}

Por enquanto MyFileInfo é recolhido, não posso acessar suas propriedades. Se eu adicionar métodos personalizados, posso invocá -los bem, mas quaisquer propriedades são desconhecidas.

Se eu não definir a classe de informações para o iterador, mas para o objeto SplfileInfo (como mostrado no exemplo no manual), ele dará o mesmo resultado desconhecido:

foreach($rit as $file) {
    // $file is a SplFileInfo instance
    $file->setInfoClass('MyFileInfo');
    var_dump( $file->getFileInfo() );
}

No entanto, funcionará quando eu fizer

foreach($rit as $file) {
    $file = new MyFileInfo($file);
    var_dump( $file );
}

Infelizmente, o código em que quero usar isso é um pouco mais complicado e empilha mais alguns iteradores. Criar a classe MyFileInfo como essa não é uma opção.

Então, alguém sabe como fazer isso funcionar ou por que o PHP se comporta tão estranho?

Obrigado.

Foi útil?

Solução

Não posso dizer exatamente o porquê, mas funciona com

class MyFileInfo extends SplFileInfo
{
  public $props;

  public function __construct($filename) {
    $this->props = array(
      'foo' => '1',
      'bar' => '2'
    );

    parent::__construct($filename);
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top