这是一个哲学,但我想很多人遇到过这个问题。目标是访问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。”*理解。即使'$ data'为null,没有任何副作用,您也可以安全地执行'isset($ data-> people [0] - > birthday-> year)'。 – netcoder
这是一个很好的观点,我没有意识到这一点。谢谢! (还有,有没有更简短的版本''$ y = isset($ x)?$ x:null;' –
没有,如果你看其他语言,PHP实际上是最短的形式。 ,你必须手动检查每个子元素为null,在Python中,你必须用'try..except'块来包围它,如果你真的想缩短,你总是可以写一个小包装函数。 – netcoder