1

如何在不抛出错误或使用“@”的情况下进行测试?

可以是有效的:

$foo->bar_x;

或者

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

我需要类似的东西:

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

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

1 回答 1

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();
}
于 2013-03-20T21:40:44.717 回答