Правильный способ установки пользовательского класса FileInfo для итератора

StackOverflow https://stackoverflow.com/questions/2572707

  •  24-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь установить пользовательский класс к итератору через 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);
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top