2013-03-31 5 views
4

Возможно ли получить доступ к данным SplObjectStorage с использованием Reflection или какого-либо другого метода? Когда я использую print_r, я вижу, что есть частная собственность $storage с массивом, содержащим все данные, но я не могу получить к нему доступ с использованием Reflection. Есть ли еще какое-то другое решение для получения данных без итерации по коллекции с помощью foreach?Доступ к данным SplObjectStorage через Reflection

+0

Я так не считаю ([посмотрите код] (http://lxr.php.net/xref/PHP_5_4/ext/spl/spl_observer.c#_spl_SplObjectStorage), если вы хотите), но что неправильно с итерацией? –

+0

@fab Я не хочу влиять на состояние объекта (изменение индекса итерации и т. Д.). Во всяком случае, я буду использовать 'clone' на данный момент ... – Smasty

ответ

5

Невозможно получить доступ к объекту $storage через Reflection, так как его не существует.

Что вы видите, когда звоните print_r (или var_dump) по классу: отладочная информация. Эта информация предоставляется через внутренний обработчик get_debug_info класса. Этот обработчик позволяет внутренним классам отображать значимую отладочную информацию без определения фактических свойств.

тангенциально смежный вопрос показывает со следующим фрагментом:

$r = new ReflectionClass('DateTime'); 
var_dump($r->hasProperty("timezone")); 

Приведенный выше код будет вам сказать, что класс не имеет timezone свойство, даже если вы можете получить доступ к timezone собственности на DateTime объектов. Причина в том, что это свойство не объявлено, оно предоставляется только через внутренний обработчик get_properties. Еще раз, это свойство, которое не предназначено для прямого доступа, оно существует только для того, чтобы: a) обеспечить значимый вывод отладки и b) указать, что должно быть сериализовано, когда объект сериализуется.

В целом: Отражение на «свойствах» внутренних классов обычно не работает, просто потому, что эти свойства часто не существуют.

Смежные вопросы