Maneira correta de definir uma classe FileInfo personalizada para um iterador
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.
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);
}
}