我使用 PHP 5.3,它引入了闭包。因为我现在在我的应用程序(和框架)中都有可用的闭包,所以我使用 is_callable 来查看处理程序$callback
的类型。
如果$callback
is_callable
,我足够了解并使用该函数/方法/闭包。如果它不可调用并且它是一个字符串,它可能是$this
类中方法的名称。它可能存在,也可能不存在。如果我把它交给 PHP,它会“抛出”一个很好的致命错误(我喜欢那些)。
但我想使用mix-ins这意味着我需要魔法方法__call
。__call
非常酷,因为它(可以)在实际函数调用之前包含逻辑。但是......如果__call
调用的方法不存在之后会发生什么?当然,我可以抛出异常,但我们要等到之后才能知道。
现在的问题是 的有用性is_callable
,因为在实现之后__call
,一切都会返回 true,因为一切都有一个后备(being __call
)。
有没有办法兼得:动态方法和有用is_callable
?
我希望看到的是某种可缓存的魔术方法__is_callable
,PHP 在is_callable(array($object, $method))
调用时会“咨询”。
在 php.net 上,我找不到像我一样对此感到困惑的人。这不可能!用了__call
就不能用is_callable
了!?
我说得有道理吗?
PS。我已经调查过了method_exists
,但这还不够好(即使我可以过滤掉所有闭包和全局函数),因为它会为私有和受保护方法以及公共方法返回 true。
编辑
我做了一个“更好”的 is_callable 来检查混音,但我认为它非常昂贵。