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.
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
@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