2013-03-20 81 views
1

如何测试这个没有抛出错误或使用“@”?如何测试属性中是否存在方法?

可以是有效的:

$foo->bar_x; 

$foo->bar()->x(); 

我需要的东西,如:

if(($foo->bar()->x())) 
    echo $foo->bar()->x(); 

if(($foo->bar_x)) 
    echo $foo->bar_x(); 

回答

3
$bar = $foo->bar(); 
if (method_exists($bar, 'x')) { 
    echo $bar->x(); 
} 

if (property_exists($foo, 'bar_x')) { 
    echo $foo->bar_x; 
} 

当然,处理你甚至不能很好地知道能够调用方法的对象并不好。应该清楚一个对象是什么类,一个方法将返回什么样的对象,以及哪些方法和属性可用。定义的接口是OOP的一个关键点。

在你最应该决定调用基于对象的类型是什么,它是:

if ($foo instanceof SomeClass) { 
    $foo->bar(); 
} else if ($foo instanceof SomeDefinedInterface) { 
    $foo->baz(); 
} 

你最好不要有歧义,在所有只处理已知类型的对象:

function (SomeClass $foo) { 
    $foo->bar(); 
}