Это немного философски, но я думаю, что многие люди столкнулись с этой проблемой. Целью является доступ к различным (динамически объявленным) свойствам в PHP и избавление от уведомлений, когда они не установлены.
Почему бы не __get
?
Это хороший вариант, если вы можете объявить свой собственный класс, но не в случае stdClass
, SimpleXML
или аналогичного. Расширение их не является и вариантом, поскольку вы обычно не создаете экземпляр этих классов напрямую, они возвращаются в результате разбора JSON/XML.
Пример:
$data = '{"name": "Pavel", "job": "programmer"}';
$object = json_decode($data);
У нас есть простой объект stdClass
. Проблемы очевидны:
$b = $data->birthday;
Свойство не определено и поэтому добавляется уведомление:
PHP Notice: Undefined property: stdClass::$birthday
Это может произойти очень часто, если учесть, что вы получаете этот объект от разбора некоторого JSON. Наивное решение очевидно:
$b = isset($data->birthday) ? $data->birthday : null;
Тем не менее, вы очень устали, когда обматываете каждый аксессуар этим. Особенно при соединении объектов, например $data->people[0]->birthday->year
. Проверьте, установлен ли people
. Проверьте, установлен ли первый элемент. Проверьте, установлен ли birthday
. Проверьте, установлен ли year
. Я чувствую себя немного ошеломленным...
Вопрос: Наконец, мой вопрос здесь. Каков наилучший подход к этой проблеме? Замечания о замораживании, по-видимому, не лучшая идея. И проверять каждое свойство сложно. Я видел некоторые решения, такие как доступ к свойствам Symfony, но я думаю, что это еще слишком много шаблонов. Есть ли более простой способ? Или сторонняя библиотека, настройка PHP, расширение C, мне все равно, насколько это работает... И каковы возможные подводные камни?