Die richtige Art und Weise eine benutzerdefinierte Klasse Fileinfo zu einem Iterator der Einstellung
Frage
Ich versuche, eine benutzerdefinierte Klasse mit einem Iterator durch die setInfoClass
Methode:
Mit dieser Methode eine benutzerdefinierte Klasse setzen, die verwendet werden, wenn getFileInfo und getPathInfo genannt werden. Der Klassenname an diese Methode übergeben müssen von SplFileInfo abgeleitet werden.
Meine Klasse ist wie dieses (vereinfachtes Beispiel):
class MyFileInfo extends SplFileInfo
{
public $props = array(
'foo' => '1',
'bar' => '2'
);
}
Der Iterator-Code ist dies:
$rit = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/some/file/path/'),
RecursiveIteratorIterator::SELF_FIRST);
Da RecursiveDirectoryIterator
ist durch Vererbung durch DirectoryIterator
auch ein SplFileInfo
Objekt, es 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 ]
}
}
Alles ist gut bis zu hier, aber wenn Iterieren über das Verzeichnis mit
$rit->getInnerIterator()->setInfoClass('MyFileInfo');
foreach($rit as $file) {
var_dump( $file );
}
ich folgende seltsames Ergebnis
erhaltenobject(MyFileInfo)#4 (3) {
["props"]=>UNKNOWN:0
["pathName":"SplFileInfo":private]=>string(49) "/some/file/path/someFile.txt"
["fileName":"SplFileInfo":private]=>string(25) "someFile.txt"
}
Während also MyFileInfo
aufgenommen wird, kann ich es nicht Eigenschaften des zuzugreifen. Wenn ich benutzerdefinierte Methoden hinzufügen, kann ich sie in Ordnung rufen, aber alle Eigenschaften sind nicht bekannt.
Wenn ich die Info-Klasse Iterator nicht gesetzt, sondern auf 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() );
}
Doch es wird funktionieren, wenn ich
foreach($rit as $file) {
$file = new MyFileInfo($file);
var_dump( $file );
}
Leider habe ich den Code wollen diese in verwenden, ist etwas komplizierter und stapelt noch einige Iteratoren. die MyFileInfo Klasse wie folgt zu schaffen, ist keine Option.
So, Wer weiß, wie diese Arbeit zu bekommen oder warum das Verhalten von PHP diesen seltsam?
Danke.
Lösung
Kann man nicht genau sagen, warum, aber es funktioniert mit
class MyFileInfo extends SplFileInfo
{
public $props;
public function __construct($filename) {
$this->props = array(
'foo' => '1',
'bar' => '2'
);
parent::__construct($filename);
}
}