如何测试这个而不会抛出错误或使用“@”?
可以有效:
$foo->bar_x;
或
$foo->bar()->x();
我需要类似的东西:
if(($foo->bar()->x()))
echo $foo->bar()->x();
if(($foo->bar_x))
echo $foo->bar_x();
答案 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();
}