2010-12-15 59 views
3

如何确保不会“调用非对象上的成员函数”致命?如何处理“调用非对象上的成员函数”

福克斯例如,我经常在我的模板是这样的:(我觉得非常方便和可读性):

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

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

回答

5

您可以使用,以确保特定的方法存在一个对象或类。

例子:

method_exists($object->getRelatedObject(), 'getProperty'); 

您还可以将接口加入到返回的relatedObjects和/或属性的对象,以确保他们拥有所需的方法。对于呼叫通常会返回NULL的情况,请将其更改为使用此方法的NullObject

$object一路链接到formatProperty是一个好主意,这也是值得怀疑的。你的$object需要知道那里的通话图。您可以从相关对象中考虑hiding the delegate并将formatProperty移动到relatedObject上,以便一次性获取和格式化,或者允许获取带有格式标记的属性。

2

每种方法总是可以在没有对象返回的情况下抛出异常。然后,换你

echo $object->getRelatedObject()->getProperty()->formatProperty(); 

在try/catch块

+1

如果没有对象返回,可能应该抛出一个异常,给定一个名称,如get * Object()。 – Craige 2010-12-15 16:32:03

+0

我很想看到一个网页设计师的脸,当他在模板中的try/catch块中st ..时。 – Dziamid 2010-12-15 20:55:21

1
<?php 
$relatedObject = $object->getRealtedObject(); 
if(is_object($relatedObject)){ 
    $property = $relatedObject->getProperty(); 
    if(is_object(property)){ 
    .... 
    } 
} 
0
<?php 
$result="record not found"; 
if(is_object($object->getRelatedObject()) && 
    is_object($object->getRelatedObject()->getProperty())) 
{ 
    $result=$object->getRelatedObject()->getPreperty()->formatProperty(); 
} 
echo $result; 
?> 

那是一个有点更具可读性:P

+0

谢谢,但我需要的是一个可读的模板解决方案,而不是一个普通的PHP脚本。在这个例子中,我使用php作为模板语言(不是很明显吗?) – Dziamid 2010-12-15 21:10:14

相关问题