如何测试属性中是否存在方法?

时间:2013-03-20 21:32:26

标签: php methods error-handling

如何测试这个而不会抛出错误或使用“@”?

可以有效:

$foo->bar_x;

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

我需要类似的东西:

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

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

1 个答案:

答案 0 :(得分: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();
}