PHP __call vs method_exists

neo*_*neo 14 php overloading

我正在处理的项目包含类似call_user_func(_array)的包装器,它在执行之前执行一些检查.其中一个检查是method_exists(In Case,提供的第一个参数是类的实例,第二个参数是方法名称)另一个是is_callable.如果其中一个检查失败,该函数将抛出异常.

我的代码包含一个带有函数名称的数组(setFoo,setBar等)和用于重载(__call)的php magic函数,它处理某些变量的设置,替换和删除(更好的某些数组元素).

问题:如果未定义函数,method_exists将返回false.

如果__call函数正确处理请求,我是否有机会得到真的?

JF *_*mon 8

__call处理对不存在的方法的调用.method_exists是一种检查方法存在的内省方法.

如何__call确定处理方法?我认为__call如果不处理您的请求并且在代码中捕获异常,则必须手动抛出异常method_exists.BadMethodCallException为此目的而存在.


gnu*_*nud 5

看看is_callable().

但不,如果该__call()方法只处理某些名称,那么您需要一些其他方法来检查调用是否成功.

我可以建议使用该方法的界面canCall($function),还是什么?然后检查类是否实现了接口.如果没有,请使用is_callable().

  • 如果定义了__call(),is_callable()会自动返回true,使得is_callable()不可靠(因为它不能确保__call()满足请求) (3认同)

Vol*_*erK 4

method_exists 尝试两件事:

  • 在类的函数表中搜索方法名称。
    这些是function foo() {}类型方法。
  • 检查类(C 代码)是否具有(C 代码)get_method()函数,以及是否调用该函数以让类实现决定。

你需要后者。但这并get_method()没有“扩展”到 PHP 脚本代码,即没有办法让 get_method() 调用一些用户定义的 PHP 脚本代码(这个 PHP 代码会返回什么?)。

因此,据我所知,答案是:不,这不可能(还?)。

的实现ZEND_FUNCTION(method_exists)可以在 中找到zend/zend_builtin_functions.c,我认为即使您不懂 C 但懂 PHP,它也具有相当的可读性。