modo corretto di impostare una classe FileInfo personalizzato a un Iterator
Domanda
Sto cercando di impostare una classe personalizzata a un Iterator attraverso il setInfoClass
metodo:
Utilizzare questo metodo per impostare una classe personalizzata che verrà utilizzata quando GetFileInfo e getPathInfo sono chiamati. Il nome della classe passato a questo metodo deve essere derivato dal SplFileInfo.
La mia classe è come questo (esempio semplificato):
class MyFileInfo extends SplFileInfo
{
public $props = array(
'foo' => '1',
'bar' => '2'
);
}
Il codice iteratore è questo:
$rit = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/some/file/path/'),
RecursiveIteratorIterator::SELF_FIRST);
RecursiveDirectoryIterator
è per eredità attraverso DirectoryIterator
anche una SplFileInfo
oggetto, fornisce il metodo setInfoClass
. Non è elencato nel manuale, ma mostra riflessione è lì:
shell$ php --rc RecursiveDirectoryIterator
// ...
Method [ <internal:SPL, inherits SplFileInfo> public method setInfoClass ] {
- Parameters [1] {
Parameter #0 [ <optional> $class_name ]
}
}
Tutto bene fino a qui, ma quando l'iterazione all'interno di una directory con
$rit->getInnerIterator()->setInfoClass('MyFileInfo');
foreach($rit as $file) {
var_dump( $file );
}
ottengo il seguente risultato strano
object(MyFileInfo)#4 (3) {
["props"]=>UNKNOWN:0
["pathName":"SplFileInfo":private]=>string(49) "/some/file/path/someFile.txt"
["fileName":"SplFileInfo":private]=>string(25) "someFile.txt"
}
Così, mentre MyFileInfo
viene prelevato, non posso accedere alle sue proprietà. Se posso aggiungere metodi personalizzati, posso invoco loro bene, ma le proprietà sono note.
Se non si imposta la classe di informazioni per l'iteratore, ma per l'oggetto SplFileInfo (come mostrato nell'esempio nel manuale), darà lo stesso risultato sconosciuto:
foreach($rit as $file) {
// $file is a SplFileInfo instance
$file->setInfoClass('MyFileInfo');
var_dump( $file->getFileInfo() );
}
Tuttavia, funzionerà quando faccio
foreach($rit as $file) {
$file = new MyFileInfo($file);
var_dump( $file );
}
Purtroppo, il codice che voglio usare questo è un po 'più complicato e impila alcuni più iteratori. Creazione della classe MyFileInfo come questo non è un'opzione.
Così, qualcuno sa come ottenere questo lavoro o perché PHP si comporta in questo strano?
Grazie.
Soluzione
Non posso dirvi esattamente perché, ma funziona con
class MyFileInfo extends SplFileInfo
{
public $props;
public function __construct($filename) {
$this->props = array(
'foo' => '1',
'bar' => '2'
);
parent::__construct($filename);
}
}