我正在处理的项目包含类似call_user_func(_array)的包装器,它在执行之前执行一些检查.其中一个检查是method_exists(In Case,提供的第一个参数是类的实例,第二个参数是方法名称)另一个是is_callable.如果其中一个检查失败,该函数将抛出异常.
我的代码包含一个带有函数名称的数组(setFoo,setBar等)和用于重载(__call)的php magic函数,它处理某些变量的设置,替换和删除(更好的某些数组元素).
问题:如果未定义函数,method_exists将返回false.
如果__call函数正确处理请求,我是否有机会得到真的?
__call处理对不存在的方法的调用.method_exists是一种检查方法存在的内省方法.
如何__call确定处理方法?我认为__call如果不处理您的请求并且在代码中捕获异常,则必须手动抛出异常method_exists.BadMethodCallException为此目的而存在.
但不,如果该__call()方法只处理某些名称,那么您需要一些其他方法来检查调用是否成功.
我可以建议使用该方法的界面canCall($function),还是什么?然后检查类是否实现了接口.如果没有,请使用is_callable().
method_exists 尝试两件事:
function foo() {}类型方法。get_method()函数,以及是否调用该函数以让类实现决定。你需要后者。但这并get_method()没有“扩展”到 PHP 脚本代码,即没有办法让 get_method() 调用一些用户定义的 PHP 脚本代码(这个 PHP 代码会返回什么?)。
因此,据我所知,答案是:不,这不可能(还?)。
的实现ZEND_FUNCTION(method_exists)可以在 中找到zend/zend_builtin_functions.c,我认为即使您不懂 C 但懂 PHP,它也具有相当的可读性。