如何在__call中使用is_callable?

时间:2011-05-09 16:51:27

标签: php call overloading override 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方法以及公共。

修改
我做了a 'better' is_callable that checks for mix-ins,但我觉得它很贵。

1 个答案:

答案 0 :(得分:4)

第一个想法:如何检查get_class_methods()中是否存在方法?此功能负责范围问题。

第二个想法:如果你正在寻找的功能在一个类中不存在,你也可以检查(使用method_exists)如果类包含__call魔术方法,如果它不包含显然要求不存在的功能是非法的。如果类包含__call方法,则调用者可能知道他正在做什么。

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