Я пытаюсь установить пользовательский класс на Итератор через setInfoClass
метод:
Используйте этот метод для установки пользовательского класса, который будет использоваться, когда 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 [ public method setInfoClass ] {
- Parameters [1] {
Parameter #0 [ $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
взят, я не могу получить доступ, это - свойства. Если я добавляю пользовательские методы, я могу вызвать их прекрасный, но любые свойства НЕИЗВЕСТНЫ.
Если я не установлю информационный класс на итератор, но на объект 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 ведет себя это странное?
Спасибо.
Не могу сказать, почему, но работает с
class MyFileInfo extends SplFileInfo
{
public $props;
public function __construct($filename) {
$this->props = array(
'foo' => '1',
'bar' => '2'
);
parent::__construct($filename);
}
}