2010-08-17 90 views
40

我正在开发一个项目,在这个项目中,我使用了旧版本的一些弃用函数。但如果在旧版本中使用,不希望我的脚本停止。 所以我正在检查函数是否存在,如果它没有,然后再次创建它。PHP中is_callable和function_exists的区别究竟是什么?

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

if(!is_callable('xyz')) { 

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

OR

if(!function_exists('xyz')) { 

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

回答

45

功能is_callable接受的callbacks不仅函数名,还有其它类型的:

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

所以is_callable接受什么,你可以通过call_user_func和家庭,如果某个功能存在(而不是方法,请参阅method_exists对于这一点,也没有关闭),而function_exists只告诉。

换句话说,is_callablezend_is_callable的包装,它处理的变量与伪类型的回调,而function_exists只能在功能表做了hash table lookup

+0

非常感谢这帮助.. – 2010-08-17 06:41:50

2

如果一个函数Plop存在,那么function_exists("Plop")将返回true。

function_exists

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

is_callable

8

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

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

7

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

0

还有一个不同:

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

如果您使用CakePHP Model类,因为它们实现了__call魔术方法来提供神奇的查询,但是如果您希望方法被绝对定义,这并不酷。