2011-05-09 28 views
10

我使用PHP 5.3,它引入了閉包。因爲我現在在整個應用程序(和框架)都有閉包,我使用is_callable來查看$callback是什麼類型的處理程序。如何通過__call使用is_callable?

如果$callbackis_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,但我認爲這是相當昂貴的。

回答

4

第一個想法:如何檢查get_class_methods()中是否存在方法?該功能處理範圍問題。

第二個想法:如果你正在尋找的函數不存在於一個類中,你也可以檢查(使用method_exists)如果類包含__call魔法,如果它不明顯地調用一個不存在的功能是非法的。如果類包含__call方法,則調用者很可能知道他在做什麼。

這些只是我的想法,我認爲Python在這類事情上會更好。

+0

'get_class_methods'確實解決了另一個問題,但不是真正的混合。這個非常重要的部分並不真實:「如果類包含'__call'方法,那麼調用者很可能知道他在做什麼。」因爲您可以爲僅有4個類(和使用)的10個類設置渲染器,而其他6個類將使用該標準,但您只需現在就設置一次。 (哇,你明白了嗎?) – Rudie 2011-05-09 17:31:51

+0

@DrMcKay你的回答幫了我很多,非常感謝 – Marecky 2013-01-27 23:03:50