我使用PHP 5.3,它引入了閉包。因爲我現在在整個應用程序(和框架)都有閉包,我使用is_callable來查看$callback
是什麼類型的處理程序。如何通過__call使用is_callable?
如果$callback
is_callable
,我足夠了解並使用該函數/方法/閉包。如果它不可調用並且是字符串,則可能是$this
類中方法的名稱。它可能存在,也可能不存在。如果我放棄PHP,它會'拋出'一個很好的致命錯誤(我喜歡這些)。
但我想用mix-ins這意味着我需要神奇的方法__call
。 __call
非常酷,因爲它可以在實際函數調用之前包含邏輯。 但是 ...如果__call
之後被調用的方法不存在,會發生什麼?當然,我可以拋出一個異常,但是直到之後我們纔會知道。
現在的問題是is_callable
用處,因爲實施後__call
,一切將返回true,因爲任何事物都有一個備用的(即__call
)。
有沒有辦法兼得:動態方法和有用is_callable
?
我希望看到的是某種可破解的神奇方法__is_callable
,當is_callable(array($object, $method))
被調用時,PHP將「諮詢」。
在php.net上,我找不到任何像我這樣笨手笨腳的人。這不可能!如果您使用__call
,則不能再使用is_callable
!?
我有什麼意義嗎?
PS。我已經看過method_exists
,但這還不夠好(即使我可以過濾掉所有閉包和全局函數),因爲它將爲私有和受保護的方法以及公共方法返回true。
編輯
我做a 'better' is_callable that checks for mix-ins,但我認爲這是相當昂貴的。
'get_class_methods'確實解決了另一個問題,但不是真正的混合。這個非常重要的部分並不真實:「如果類包含'__call'方法,那麼調用者很可能知道他在做什麼。」因爲您可以爲僅有4個類(和使用)的10個類設置渲染器,而其他6個類將使用該標準,但您只需現在就設置一次。 (哇,你明白了嗎?) – Rudie 2011-05-09 17:31:51
@DrMcKay你的回答幫了我很多,非常感謝 – Marecky 2013-01-27 23:03:50