2010-04-03 10 views
6

Je suis en train de définir une classe personnalisée à un Iterator par la méthode setInfoClass:manière correcte de la définition d'une classe FileInfo personnalisée à un Iterator

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 transmis à cette méthode doit être dérivé 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 à travers DirectoryIterator aussi un objet SplFileInfo, il fournit la méthode 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 bien jusqu'à, 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 bizarre suivant

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

Alors que MyFileInfo est ramassé, je ne peux pas accéder à ses propriétés. Si j'ajoute des méthodes personnalisées, je peux les appeler correctement, mais toutes les propriétés sont UNKNOWN.

Si je le fais, il donnera pas défini la classe d'information à l'iterator, mais à l'objet SplFileInfo (comme le montre l'exemple dans le manuel) 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éer la classe MyFileInfo comme ceci n'est pas une option. Donc, est-ce que quelqu'un sait comment faire fonctionner ça ou pourquoi PHP se comporte-t-il bizarrement?

Merci.

+1

Il y a un bug lié au dépôt [# 51374] (http://bugs.php.net/51374) pour SplFileObject mais semble être le même problème. – salathe

+0

@salathe Merci. Je cherchais des bugs moi-même mais je n'ai pas trouvé celui-ci. C'est à peu près le problème auquel je suis confronté. – Gordon

Répondre

2

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); 
    } 
} 
+0

Cela fera l'affaire. Ce n'est pas joli dans la classe finale et je suis toujours curieux de savoir si c'est un bug ou juste quelque chose que je ne comprends pas, mais ça va servir mon but. Merci! – Gordon