Корректный способ установить пользовательский класс FileInfo на Итератор

Я пытаюсь установить пользовательский класс на Итератор через 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 ведет себя это странное?

Спасибо.

6
задан Gordon 3 April 2010 в 21:26
поделиться

1 ответ

Не могу сказать, почему, но работает с

class MyFileInfo extends SplFileInfo
{
  public $props;

  public function __construct($filename) {
    $this->props = array(
      'foo' => '1',
      'bar' => '2'
    );

    parent::__construct($filename);
  }
}
2
ответ дан 17 December 2019 в 20:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: