Ich versuche, eine benutzerdefinierte Klasse mit einem Iterator durch die setInfoClass
Verfahren einzustellen:korrekte Art und Weise eine benutzerdefinierte Klasse Fileinfo zu einem Iterator der Einstellung
Mit dieser Methode können Sie eine benutzerdefinierte Klasse festlegen, die verwendet werden, wenn getFileInfo und getPathInfo werden aufgerufen. Der an diese Methode übergebene Klassenname muss von SplFileInfo abgeleitet sein.
ist meine Klasse wie dieses (vereinfachtes Beispiel):
class MyFileInfo extends SplFileInfo
{
public $props = array(
'foo' => '1',
'bar' => '2'
);
}
Der Iterator Code hierfür lautet:
$rit = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/some/file/path/'),
RecursiveIteratorIterator::SELF_FIRST);
Da RecursiveDirectoryIterator
ist durch Vererbung durch DirectoryIterator
auch ein SplFileInfo
Objekt, sondern bietet die setInfoClass
Methode. Es ist nicht im Handbuch aufgeführt, aber Reflexion zeigt, dass es da:
shell$ php --rc RecursiveDirectoryIterator
// ...
Method [ <internal:SPL, inherits SplFileInfo> public method setInfoClass ] {
- Parameters [1] {
Parameter #0 [ <optional> $class_name ]
}
}
gut Alles hier, aber wenn Iteration über das Verzeichnis mit
$rit->getInnerIterator()->setInfoClass('MyFileInfo');
foreach($rit as $file) {
var_dump($file);
}
bekomme ich folgendes seltsames Ergebnis
object(MyFileInfo)#4 (3) {
["props"]=>UNKNOWN:0
["pathName":"SplFileInfo":private]=>string(49) "/some/file/path/someFile.txt"
["fileName":"SplFileInfo":private]=>string(25) "someFile.txt"
}
Also, während MyFileInfo
abgeholt wird, kann ich nicht auf seine Eigenschaften zugreifen. Wenn ich benutzerdefinierte Methoden hinzufüge, kann ich sie gut aufrufen, aber alle Eigenschaften sind UNBEKANNT.
Wenn ich nicht setze die Info-Klasse Iterator, sondern das SplFileInfo Objekt (wie im Beispiel im Handbuch gezeigt), wird es das gleiche UNKNOWN Ergebnis geben:
foreach($rit as $file) {
// $file is a SplFileInfo instance
$file->setInfoClass('MyFileInfo');
var_dump($file->getFileInfo());
}
jedoch es wird funktionieren, wenn ich
tunforeach($rit as $file) {
$file = new MyFileInfo($file);
var_dump($file);
}
Leider ist der Code, den ich diese in verwenden möchten ist etwas komplizierter und stapelt noch einige Iteratoren. Das Erstellen der MyFileInfo-Klasse wie diesem ist keine Option.
Also weiß jemand, wie man das funktioniert oder warum PHP so seltsam verhält?
Danke.
Es gibt einen ähnlichen Fehler bei [# 51374] (http://bugs.php.net/51374) für SplFileObject eingereicht ist, aber scheint das gleiche Problem sein. – salathe
@salathe Danke. War selbst auf der Suche nach Ungeziefer, fand dieses aber nicht. Das ist ziemlich genau das Problem, vor dem ich stehe. – Gordon