Die richtige Art und Weise eine benutzerdefinierte Klasse Fileinfo zu einem Iterator der Einstellung

StackOverflow https://stackoverflow.com/questions/2572707

  •  24-09-2019
  •  | 
  •  

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

erhalten
object(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.

War es hilfreich?

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);
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top