Это немного философски, но я думаю, что многие люди столкнулись с этой проблемой. Целью является доступ к различным (динамически объявленным) свойствам в PHP и избавление от уведомлений, когда они не установлены.Как решить недостающие свойства объекта в 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 property access, но я думаю, что это еще слишком много шаблонов. Есть ли более простой способ? Или сторонняя библиотека, настройка PHP, расширение C, мне все равно, насколько это работает ... И каковы возможные подводные камни?
* «Тем не менее, очень быстро устаешь, когда обматываете каждый аксессуар этим. Особенно, когда цепочки объектов, такие как $ data-> people [0] -> birthday-> year." * Я не Понимаю. Вы можете безопасно выполнять 'isset ($ data-> people [0] -> birthday-> year)', даже если '$ data' равно null без каких-либо побочных эффектов. – netcoder
Это очень хороший момент, я не знал об этом. Благодаря! (И все же существует ли более короткая версия '$ y = isset ($ x)? $ X: null;' –
Нет. Если вы посмотрите на другие языки, у PHP на самом деле есть кратчайшая форма. , вам придется проверять каждый подэлемент на null вручную. В Python вам придется окружить его блоком 'try..except'. Если вы действительно хотите короче, вы всегда можете написать небольшую функцию обертки. – netcoder