如何处理“调用非对象上的成员函数”

时间:2010-12-15 16:22:42

标签: php

您如何确保没有“对非对象的成员函数的调用”致命?

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; ?>

但这不再那么可读了。你是如何解决这个问题的?

4 个答案:

答案 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