PHP中的is_callable和function_exists究竟有什么区别?

我正在从事一个项目,其中我正在使用一些旧版本的弃用function。 但是如果在旧版本中使用,不要让脚本停止。 所以我正在检查函数是否存在,如果它不,然后再次创build它。

但是, function_existsis_callable在php中有什么区别,哪一个对用户更好?

 if(!is_callable('xyz')) { function xyz() { // code goes here } } 

要么

 if(!function_exists('xyz')) { function xyz() { // code goes here } } 

函数is_callable不仅接受函数名称,还接受其他types的callback :

  • Foo::method
  • array("Foo", "method")
  • array($obj, "method")
  • 闭包和其他可调用对象(PHP 5.3)

所以is_callable接受任何可以传递call_user_func和family的东西,而function_exists只会告诉某个函数是否存在(不是方法,请参阅method_exists ,也不要closures)。

换句话说, is_callablezend_is_callable一个包装器,它使用伪typescallback来处理variables,而function_exists只在函数的表中做一个哈希表查找 。

当与一个函数(不是类方法)一起使用时,除了function_exists稍快之外,没有区别。

但是当用来检查类中方法的存在时,你不能使用function_exists 。 你将不得不使用is_callablemethod_exists

当在类上下文中使用时, is_callable对于可访问的类方法(例如公共方法)返回true,但对于所有方法(public,protected和private), method_exists返回true。 function_exists与类上下文中的method_exists做相同的事情。

如果函数Plop存在,则function_exists("Plop")将返回true。

请参阅function_exists

如果一个variables是可调用的,那么is_callable($var)将返回true。
现在这可能意味着$var是一个函数名称。
但我也可以是一个对象和方法名称组合。

请参阅is_callable

又一个不同:

如果您有一个使用__call魔术方法的类,则is_callable($object, $method)将始终返回true,因为__call基本上接受每个方法的名称。 正如你可能已经知道的,如果方法没有在类中定义, method_exists将返回false。

如果你使用CakePHP Model类来实现__call魔术方法来提供神奇的查询,那么这是特别烦人的,但是如果你希望方法被绝对定义的话,就不会很酷。