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

时间:2010-08-17 06:08:28

标签: php

我正在开发一个项目,我正在使用旧版本的一些不推荐使用的功能。但是如果在旧版本中使用,则不希望我的脚本被停止。 所以我正在检查函数是否存在,如果不存在则再次创建它。

但是php中的function_existsis_callable之间有什么区别?哪个更适合用户?

if(!is_callable('xyz')) {

  function xyz() {
    // code goes here
  }
}

OR

if(!function_exists('xyz')) {

  function xyz() {
    // code goes here
  }
}

5 个答案:

答案 0 :(得分:54)

函数is_callable不仅接受函数名称,还接受其他类型的callbacks

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

所以is_callable接受您可以传递call_user_func和家人的任何内容,而function_exists只会告诉某个函数是否存在(不是方法,请参阅method_exists,也不是封闭件)。

换句话说,is_callablezend_is_callable的包装器,它使用伪类型回调来处理变量,而function_exists只在函数中执行hash table lookup

答案 1 :(得分:12)

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

但是当用于检查类中方法的存在时,不能使用function_exists。您必须使用is_callablemethod_exists

答案 2 :(得分:9)

在类上下文中使用时,is_callable对于可访问的类方法返回true,即公共方法,但method_exists对所有方法都返回true - public,protected和private。 function_exists与类上下文之外的method_exists做同样的事情。

答案 3 :(得分:3)

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

请参阅function_exists

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

请参阅is_callable

答案 4 :(得分:1)

又一个不同:

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

如果您使用CakePHP Model类,因为它们实现了__call魔术方法来提供魔术查询,这尤其令人讨厌,但如果您希望绝对定义该方法,则不会很酷。