2013-03-20 38 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(); 
}