我正在开发一个项目,我正在使用旧版本的一些不推荐使用的功能。但是如果在旧版本中使用,则不希望我的脚本被停止。 所以我正在检查函数是否存在,如果不存在则再次创建它。
但是php中的function_exists
和is_callable
之间有什么区别?哪个更适合用户?
if(!is_callable('xyz')) {
function xyz() {
// code goes here
}
}
OR
if(!function_exists('xyz')) {
function xyz() {
// code goes here
}
}
答案 0 :(得分:54)
函数is_callable
不仅接受函数名称,还接受其他类型的callbacks:
Foo::method
array("Foo", "method")
array($obj, "method")
所以is_callable
接受您可以传递call_user_func
和家人的任何内容,而function_exists
只会告诉某个函数是否存在(不是方法,请参阅method_exists
,也不是封闭件)。
换句话说,is_callable
是zend_is_callable
的包装器,它使用伪类型回调来处理变量,而function_exists
只在函数中执行hash table lookup表
答案 1 :(得分:12)
当与函数(不是类方法)一起使用时,除了function_exists
稍快一点之外没有区别。
但是当用于检查类中方法的存在时,不能使用function_exists
。您必须使用is_callable
或method_exists
。
答案 2 :(得分:9)
在类上下文中使用时,is_callable
对于可访问的类方法返回true,即公共方法,但method_exists
对所有方法都返回true - public,protected和private。 function_exists
与类上下文之外的method_exists
做同样的事情。
答案 3 :(得分:3)
如果存在函数Plop
,则function_exists("Plop")
将返回true。
如果变量是可调用的,则is_callable($var)
将返回true
现在这可能意味着$var
是函数名称
但我也可以是一个对象和方法名称组合。
请参阅is_callable
答案 4 :(得分:1)
又一个不同:
如果您有一个使用__call
magic method的课程,is_callable($object, $method)
将始终返回true,因为__call
基本上接受每个方法名称。正如您可能已经知道的那样,如果未在类中定义该方法,method_exists
将返回false。
如果您使用CakePHP Model
类,因为它们实现了__call
魔术方法来提供魔术查询,这尤其令人讨厌,但如果您希望绝对定义该方法,则不会很酷。