Question

Je suis en train de définir une classe personnalisée à un Iterator par le setInfoClass méthode:

  

Utilisez cette méthode pour définir une classe personnalisée qui sera utilisée lors getFileInfo et getPathInfo sont appelés. Le nom de classe est passé à cette méthode doit être dérivée de SplFileInfo.

Ma classe est comme ceci (exemple simplifié):

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

Le code iterator est la suivante:

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

Depuis RecursiveDirectoryIterator est par héritage par DirectoryIterator également l'objet de SplFileInfo, il fournit la méthode de setInfoClass. Il est ne figure pas dans le manuel, mais la réflexion montre qu'il est là:

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

Tout bon jusqu'ici, mais lorsque vous parcourez le répertoire avec

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

Je reçois le résultat suivant bizarre

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

Ainsi, alors que MyFileInfo est pris, je ne peux pas accéder à ses propriétés. Si j'ajouter des méthodes personnalisées, je peux les invoquons bien, mais les propriétés sont UNKNOWN.

Si je ne mets pas la classe d'information à l'iterator, mais à l'objet SplFileInfo (comme le montre l'exemple dans le manuel), il donnera le même résultat UNKNOWN:

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

Cependant, il fonctionnera quand je fais

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

Malheureusement, le code que je veux utiliser dans est un peu plus compliqué et empile un peu plus itérateurs. Création de la classe MyFileInfo comme ce n'est pas une option.

Alors, est-ce que quelqu'un sait comment obtenir ce travail ou pourquoi PHP se comporte de cette bizarre?

Merci.

Était-ce utile?

La solution

ne peux pas vous dire exactement pourquoi, mais il fonctionne avec

class MyFileInfo extends SplFileInfo
{
  public $props;

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

    parent::__construct($filename);
  }
}
scroll top