2013-08-30 14 views
0

下面的例子將是肯定的輸出錯誤:模擬__call()用於非對象

$myVar = "hello"; 
$var->exeptionForSure(); 

==> Fatal error: Call to a member function exeptionForSure() on a non-object in.. 

有沒有一種方法,我可以模擬/執行魔術方法__call()在這種情況還工作嗎?

我想能夠調用我自己的函數,如果由於某種原因,我嘗試在非對象的訪問方法。

回答

1

PHP中對此沒有設施,並且有可能永遠會。

任何這樣的方法將不得不在全球範圍存在的PHP腳本的時間(沒有課方面它要在其中運行)和它的存在可能會變得複雜的代碼很多關於這樣一個不尋常的要求。

這也將意味着稍稍有些奇怪的作用域規則:假設$non_object->method(42);被翻譯爲magic_non_object_call($non_object, 'method', array(42));左手操作數($non_object)將在按值傳遞(在這種情況下,它不能被寫回)或者通過引用(這要求PHP放棄對該變量的「寫入時複製」內存優化)。請注意,對象與抽象的附加層來表示,以便$this(並通過或「由值」複製的對象)實際包含手柄到的「真實」對象,避免這種確切的問題。

基本上,您應該需要這樣做的唯一原因是作爲「最後一個溝渠」錯誤處理程序 - 如果您的代碼無法分辨給定變量是否爲對象,那就是一個錯誤。不幸的是,這是一個致命錯誤,所以我不認爲你可以抓住/處理它。 (請注意,它是而不是的一個例外;很少有PHP內置引發異常。)

0

這應該工作:

method_exists($var, 'exeptionForSure') ? $var->exeptionForSure() : fallback(); 

您也可以定義爲對象的具體方法,將做上面一樣,所以你可以做以下操作:

$obj->call_func('func_name', $params); 
+0

這將需要我更改所有代碼,我正在尋找全局解決方案... – TCB13

0

只有對象有方法即你可以調用。在PHP中,字符串,數字等不是對象,因此您無法定義或調用方法。

method_exists檢查是否一定的方法存在對於給定的對象。但是你不應該爲非對象調用這個函數。

首先,你應該檢查是否是$ var是一個對象或不:

if (is_object($var) && method_exists($var, 'exeptionForSure')) { 
    $var->exeptionForSure(); 
} else { 
    fallback(); 
}