Правильный способ установки пользовательского класса FileInfo для итератора
Вопрос
Я пытаюсь установить пользовательский класс к итератору через setInfoClass
Метод:
Используйте этот метод для установки пользовательского класса, который будет использоваться, когда называются GetFileInfo и GetPathinfo. Имя класса, передаваемое на этот метод, должно быть получено из SPLFIIIIIIINFO.
Мой класс такой (упрощенный пример):
class MyFileInfo extends SplFileInfo
{
public $props = array(
'foo' => '1',
'bar' => '2'
);
}
Код итератора это:
$rit = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/some/file/path/'),
RecursiveIteratorIterator::SELF_FIRST);
С RecursiveDirectoryIterator
по наследству через DirectoryIterator
Также АН SplFileInfo
объект, это обеспечивает setInfoClass
метод. Это не перечислено в руководстве, но отражение показывает, что он там:
shell$ php --rc RecursiveDirectoryIterator
// ...
Method [ <internal:SPL, inherits SplFileInfo> public method setInfoClass ] {
- Parameters [1] {
Parameter #0 [ <optional> $class_name ]
}
}
Все хорошо здесь, но при итерации по каталогу с
$rit->getInnerIterator()->setInfoClass('MyFileInfo');
foreach($rit as $file) {
var_dump( $file );
}
Я получаю следующий странный результат
object(MyFileInfo)#4 (3) {
["props"]=>UNKNOWN:0
["pathName":"SplFileInfo":private]=>string(49) "/some/file/path/someFile.txt"
["fileName":"SplFileInfo":private]=>string(25) "someFile.txt"
}
Так что пока MyFileInfo
Поднят, я не могу получить доступ к своим свойствам. Если я добавлю пользовательские методы, я могу вызвать их нормально, но любые свойства неизвестны.
Если я не установлю класс информации к итератору, но к объекту SPLFIIIILEINFO (как показано в примере в руководстве), он даст тот же неизвестный результат:
foreach($rit as $file) {
// $file is a SplFileInfo instance
$file->setInfoClass('MyFileInfo');
var_dump( $file->getFileInfo() );
}
Тем не менее, это будет работать, когда я делаю
foreach($rit as $file) {
$file = new MyFileInfo($file);
var_dump( $file );
}
К сожалению, код, который я хочу использовать, это несколько сложнее и стекирует еще несколько итераторов. Создание класса MyFileInfo, как это не вариант.
Итак, кто-нибудь знает, как получить эту работу или почему PHP ведет себя этим странным?
Спасибо.
Решение
Не могу точно сказать, почему, но это работает с
class MyFileInfo extends SplFileInfo
{
public $props;
public function __construct($filename) {
$this->props = array(
'foo' => '1',
'bar' => '2'
);
parent::__construct($filename);
}
}