2010-04-03 2 views
6

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

Спасибо.

+1

Существует родственная ошибка, поданная в [# 51374] (http://bugs.php.net/51374) для SplFileObject, но, как представляется, быть той же проблемой. – salathe

+0

@salathe Спасибо. Я искал ошибки самостоятельно, но не нашел этого. Это в значительной степени проблема, с которой я сталкиваюсь. – Gordon

ответ

2

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

class MyFileInfo extends SplFileInfo 
{ 
    public $props; 

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

    parent::__construct($filename); 
    } 
} 
+0

Это будет сделано. В финальном классе это некрасиво, и мне все еще интересно, это ошибка или просто что-то я не понимаю, но она будет служить моей цели. Благодаря! – Gordon