Próbuję ustawić niestandardowej klasy do iterator dzięki metodzie setInfoClass
:Prawidłowy sposób ustawiania niestandardową klasę FileInfo do iterator
użyć tej metody, aby ustawić niestandardową klasę, która będzie używana podczas getFileInfo i getPathInfo są wywoływane. Nazwa klasy przekazana do tej metody musi pochodzić od SplFileInfo.
My klasa tak (uproszczony przykład)
class MyFileInfo extends SplFileInfo
{
public $props = array(
'foo' => '1',
'bar' => '2'
);
}
Kod iteracyjnej to:
$rit = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/some/file/path/'),
RecursiveIteratorIterator::SELF_FIRST);
Ponieważ RecursiveDirectoryIterator
jest dziedziczenia przez DirectoryIterator
również przedmiotem SplFileInfo
, przewiduje metoda setInfoClass
. To nie jest wymienione w instrukcji, ale refleksja pokazuje, że tam jest:
shell$ php --rc RecursiveDirectoryIterator
// ...
Method [ <internal:SPL, inherits SplFileInfo> public method setInfoClass ] {
- Parameters [1] {
Parameter #0 [ <optional> $class_name ]
}
}
Wszystko dobrze się tutaj, ale podczas iteracji nad katalogu z
$rit->getInnerIterator()->setInfoClass('MyFileInfo');
foreach($rit as $file) {
var_dump($file);
}
uzyskać następujący wynik dziwne
object(MyFileInfo)#4 (3) {
["props"]=>UNKNOWN:0
["pathName":"SplFileInfo":private]=>string(49) "/some/file/path/someFile.txt"
["fileName":"SplFileInfo":private]=>string(25) "someFile.txt"
}
Po pobraniu MyFileInfo
nie mogę uzyskać dostępu do jego właściwości. Jeśli dodaję metody niestandardowe, mogę je wywołać dobrze, ale wszelkie właściwości są NIEZNANE.
Jeśli nie ustawić klasę informacji do iteracyjnej, ale do obiektu SplFileInfo (jak pokazano w przykładzie w instrukcji), to daje taki sam wynik nieznane:
foreach($rit as $file) {
// $file is a SplFileInfo instance
$file->setInfoClass('MyFileInfo');
var_dump($file->getFileInfo());
}
jednak zadziała, gdy wykonam Niestety kod, w którym chcę go użyć jest nieco bardziej skomplikowany i zawiera więcej iteratorów. Tworzenie takiej klasy MyFileInfo nie jest opcją.
Czy ktoś wie, jak to działa, dlaczego PHP zachowuje się tak dziwacznie?
Dzięki.
Jest powiązany bug złożony w [# 51374] (http://bugs.php.net/51374) dla SplFileObject ale wydaje się być tym samym problemem. – salathe
@salathe Dzięki. Szukałem błędów, ale nie znalazłem tego. To problem, z którym się borykam. – Gordon