10

我使用 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 来检查混音,但我认为它非常昂贵。

4

1 回答 1

4

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

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

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

于 2011-05-09T17:07:51.327 回答