PHP中的is_callable和function_exists究竟有什么区别?
我正在从事一个项目,其中我正在使用一些旧版本的弃用function。 但是如果在旧版本中使用,不要让脚本停止。 所以我正在检查函数是否存在,如果它不,然后再次创build它。
但是, function_exists
和is_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_callable
是zend_is_callable
一个包装器,它使用伪typescallback来处理variables,而function_exists
只在函数的表中做一个哈希表查找 。
当与一个函数(不是类方法)一起使用时,除了function_exists
稍快之外,没有区别。
但是当用来检查类中方法的存在时,你不能使用function_exists
。 你将不得不使用is_callable
或method_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
魔术方法来提供神奇的查询,那么这是特别烦人的,但是如果你希望方法被绝对定义的话,就不会很酷。