2010-04-03 2 views
6

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

tun
foreach($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.

+1

Es gibt einen ähnlichen Fehler bei [# 51374] (http://bugs.php.net/51374) für SplFileObject eingereicht ist, aber scheint das gleiche Problem sein. – salathe

+0

@salathe Danke. War selbst auf der Suche nach Ungeziefer, fand dieses aber nicht. Das ist ziemlich genau das Problem, vor dem ich stehe. – Gordon

Antwort

2

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

Dies wird ausreichen. Es ist nicht schön in der letzten Klasse und ich bin immer noch neugierig, ob das ein Bug oder etwas ist, das ich nicht verstehe, aber es wird meinem Zweck dienen. Vielen Dank! – Gordon

Verwandte Themen