【发布时间】:2011-08-21 20:25:57
【问题描述】:
我使用 PHP 5.3,它引入了闭包。因为我现在在整个应用程序(和框架)中都有可用的闭包,所以我使用 is_callable 来查看 $callback 是什么类型的处理程序。
如果$callbackis_callable,我足够了解并使用该函数/方法/闭包。如果它不可调用并且是一个字符串,那么它可能是$this 类中的方法名称。它可能存在,也可能不存在。如果我把它交给 PHP,它会“抛出”一个很好的致命错误(我喜欢那些)。
但我想使用mix-ins,这意味着我需要魔术方法__call。 __call 非常酷,因为它(可以)在实际函数调用之前包含逻辑。 但是...如果在__call 之后被调用的方法不存在怎么办?当然,我可以抛出异常,但我们要等到之后才能知道。
现在的问题是is_callable 的用处,因为在实现__call 之后,everything 将返回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,但我觉得它很贵。
【问题讨论】:
标签: php call overloading overriding magic-methods