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.

È stato utile?

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);
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top