我使用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,但我觉得它很贵。
答案 0 :(得分:4)
第一个想法:如何检查get_class_methods()
中是否存在方法?此功能负责范围问题。
第二个想法:如果你正在寻找的功能在一个类中不存在,你也可以检查(使用method_exists
)如果类包含__call
魔术方法,如果它不包含显然要求不存在的功能是非法的。如果类包含__call
方法,则调用者可能知道他正在做什么。
这些只是我的想法,我认为Python在这类事情上会更好。