下面的例子將是肯定的輸出錯誤:模擬__call()用於非對象
$myVar = "hello";
$var->exeptionForSure();
==> Fatal error: Call to a member function exeptionForSure() on a non-object in..
有沒有一種方法,我可以模擬/執行魔術方法__call()
在這種情況還工作嗎?
我想能夠調用我自己的函數,如果由於某種原因,我嘗試在非對象的訪問方法。
下面的例子將是肯定的輸出錯誤:模擬__call()用於非對象
$myVar = "hello";
$var->exeptionForSure();
==> Fatal error: Call to a member function exeptionForSure() on a non-object in..
有沒有一種方法,我可以模擬/執行魔術方法__call()
在這種情況還工作嗎?
我想能夠調用我自己的函數,如果由於某種原因,我嘗試在非對象的訪問方法。
PHP中對此沒有設施,並且有可能永遠會。
任何這樣的方法將不得不在全球範圍存在的PHP腳本的時間(沒有課方面它要在其中運行)和它的存在可能會變得複雜的代碼很多關於這樣一個不尋常的要求。
這也將意味着稍稍有些奇怪的作用域規則:假設$non_object->method(42);
被翻譯爲magic_non_object_call($non_object, 'method', array(42));
左手操作數($non_object
)將在按值傳遞(在這種情況下,它不能被寫回)或者通過引用(這要求PHP放棄對該變量的「寫入時複製」內存優化)。請注意,對象與抽象的附加層來表示,以便$this
(並通過或「由值」複製的對象)實際包含手柄到的「真實」對象,避免這種確切的問題。
基本上,您應該需要這樣做的唯一原因是作爲「最後一個溝渠」錯誤處理程序 - 如果您的代碼無法分辨給定變量是否爲對象,那就是一個錯誤。不幸的是,這是一個致命錯誤,所以我不認爲你可以抓住/處理它。 (請注意,它是而不是的一個例外;很少有PHP內置引發異常。)
這應該工作:
method_exists($var, 'exeptionForSure') ? $var->exeptionForSure() : fallback();
您也可以定義爲對象的具體方法,將做上面一樣,所以你可以做以下操作:
$obj->call_func('func_name', $params);
只有對象有方法即你可以調用。在PHP中,字符串,數字等不是對象,因此您無法定義或調用方法。
method_exists檢查是否一定的方法存在對於給定的對象。但是你不應該爲非對象調用這個函數。
首先,你應該檢查是否是$ var是一個對象或不:
if (is_object($var) && method_exists($var, 'exeptionForSure')) {
$var->exeptionForSure();
} else {
fallback();
}
這將需要我更改所有代碼,我正在尋找全局解決方案... – TCB13