Я пытаюсь установить пользовательский класс итератора через setInfoClass
метод:Правильный способ настройки пользовательского FileInfo класс итератора
Используйте этот метод, чтобы установить пользовательский класс, который будет использоваться при GetFileInfo и getPathInfo. Имя класса, переданное этому методу, должно быть получено из SplFileInfo.
Мой класс, как это (упрощенный пример):
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
, я не могу получить доступ к его свойствам. Если я добавлю специальные методы, я могу вызвать их штраф, но любые свойства UNKNOWN.
Если я не установлен информационный класс итератора, но к объекту SplFileInfo (как показано в примере в руководстве), это даст тот же результат: НЕИЗВЕСТНЫЙ
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 ведет себя странно?
Спасибо.
Существует родственная ошибка, поданная в [# 51374] (http://bugs.php.net/51374) для SplFileObject, но, как представляется, быть той же проблемой. – salathe
@salathe Спасибо. Я искал ошибки самостоятельно, но не нашел этого. Это в значительной степени проблема, с которой я сталкиваюсь. – Gordon