您如何确保没有“对非对象的成员函数的调用”致命?
Fox示例,我的模板中经常有这样的东西:(我觉得非常方便和可读):
<?php echo $object->getRelatedObject()->getProperty()->formatProperty() ?>
但是,只有在每个方法返回正确类的对象时,这才有效。但情况并非总是如此。相关对象可能不存在于数据库中,因此它返回null并且您将面临致命错误。然后你去手动检查返回值:
<?php if (is_object($object->getRelatedObject()) && is_object($object->getRelatedObject()->getProperty())):
<?php echo $object->getRelatedObject()->getPreperty()->formatProperty() ?>
<?php endif; ?>
但这不再那么可读了。你是如何解决这个问题的?
答案 0 :(得分:5)
您可以使用method_exists
来确保对象或类中存在特定方法。
示例:强>
method_exists($object->getRelatedObject(), 'getProperty');
您还可以向返回的relatedObjects和/或属性对象添加接口,以确保它们具有所需的方法。对于通常会返回NULL
的情况,请将其更改为具有此方法的NullObject
。
从$object
一直到formatProperty
的链接是一个好主意,这也是值得怀疑的。您的$object
需要熟悉调用图。您可以从相关对象中考虑hiding the delegate并将formatProperty
移到relatedObject
上以一次性获取和格式化,或者允许使用格式化标记获取属性。
答案 1 :(得分:2)
每个方法都可以在没有返回对象的情况下抛出异常。然后你打包
echo $object->getRelatedObject()->getProperty()->formatProperty();
在try / catch块中
答案 2 :(得分:1)
<?php
$relatedObject = $object->getRealtedObject();
if(is_object($relatedObject)){
$property = $relatedObject->getProperty();
if(is_object(property)){
....
}
}
答案 3 :(得分:0)
<?php
$result="record not found";
if(is_object($object->getRelatedObject()) &&
is_object($object->getRelatedObject()->getProperty()))
{
$result=$object->getRelatedObject()->getPreperty()->formatProperty();
}
echo $result;
?>
更具可读性:p