如何在__call中使用is_callable?

Rud*_*die 10 php overriding overloading call magic-methods

我使用PHP 5.3,它引入了闭包.因为我现在在我的应用程序(和框架)中都有可用的闭包,所以我使用is_callable来查看是什么类型的处理程序$callback.

如果$callback is_callable,我足够了解并使用该函数/方法/闭包.如果它不可调用并且它是一个字符串,那么它可能是$this类中方法的名称.它可能存在,也可能不存在.如果我让它升级到PHP,它将"抛出"一个很好的致命错误(我喜欢那些).

但我想使用mix-ins,这意味着我需要魔术方法__call.__call非常酷,因为它(可以)在实际函数调用之前包含(s)逻辑.但是 ......如果在__call被叫方法不存在之后会发生什么?当然,我可以抛出一个例外,但直到之后我们才会知道.

问题现在是有用的is_callable,因为在实现之后__call,一切都将返回true,因为一切都有回退(存在__call).

有没有办法同时拥有:动态方法和有用的方法is_callable

我希望看到的是某种可缓存的魔术方法__is_callable,PHP将在is_callable(array($object, $method))调用时"咨询" .

在php.net上,我找不到任何像我这样对此感到愚蠢的人.这不可能!如果你使用__call,你就不is_callable能再使用了!?

我有意义吗?

PS.我已经研究过了,method_exists但这还不够好(即使我可以过滤掉所有的闭包和全局函数),因为它将为私有和受保护的方法以及公共方法返回true.

编辑
我制作了一个'更好'的is_callable来检查混音,但我认为它非常昂贵.

Dr *_*Kay 4

第一个想法:检查方法是否存在于 中怎么样get_class_methods()?该函数负责处理范围问题。

第二个想法:如果您要查找的函数不存在于类中,您还可以检查(使用method_exists)类是否包含__call魔术方法,如果不包含,则显然调用不存在的函数是非法的。如果类包含__call方法,调用者很可能知道他在做什么。

这些只是我的想法,我认为 Python 在这类事情上会更好。