今天在YII框架事件处理中看到了is_callable函数,后来发现这个函数有与method_exists,function_exists有着使用的混淆的感觉,为了能更好的理解其功能,下面就来最个分析:(个人技术有限如果有误还请指正


is_callable

验证变量的内容是否能够进行函数调用

bool is_callable ( callback $name [, bool $syntax_only = false [, string &$callable_name ]] )


参数:$name 可以接受数组(包含两个元素,一个对象,一个方法名字符串)与字符串(函数名)。当然这只是正确的可调用函数的参数。

$syntax_only 为真时只验证 $name 参数可能为函数或方法(只判断传入的$name参数是不是简单的字符串,如果是数组会判断是不是只包含两个字符串或第一个是对象第二个是字符串)。如果为 false 会对$name判断更加准确(如果是字符串会判断函数是否可用或合法,当是数组时第一个参数必须是对象,第二个必须是字符串)。

$callable_name 返回(引用处理)调用函数的基本形式,如果前面判断失败返回$name参数(如果不是字符串会强制转换为字符串)。

154445811.jpg

上面的结果是 bool(true) bool(false)

当$syntax_only为假 会判断函数是否可用或合法,第一个 test 函数已经声明,所以返回true 第二个 test1 函数不存在,所以返回false。

154534258.jpg

上面的结果是 bool(true) bool(true)

当$syntax_only为真 只判断$name参数是不是字符串并不关心函数是否可用或合法,当然如果$name非字符串那么函数返回false。

160455273.jpg

上面的结果是 bool(true) bool(true) bool(false) bool(false)

当$syntax_only为假 会判断数组第一个参数是否为对象第二个参数是否为字符串并不关心是否为该对象的方法。

161009748.jpg

上面的结果是 bool(true) bool(true) bool(true) bool(false)

当$syntax_only为真 会判断数组第一个参数是否为对象或字符串第二个参数是否为字符串并不关心是否为该对象的方法。


这个函数用于判断某个变量是否为可调用的函数或方法,如果判断的是数组只会判断第一个是不是为对象($syntax_only为false时)或为字符串($syntax_only为true时),第二个是不是字符串,并不能判断是否有合法方法或是不是该对象的方法,如果$name是字符串会判断函数是否存在或合法($syntax_only为false)或该参数是不是字符串($syntax_only为true时)。当is_callable('a::test')也是为真的,因为这个只验证参数内容是否为可调用函数的。最后的一个参数只是提取调用函数的形式串,不论$name是否判断通过都会修改该参数的值,实际应用不大,当$name判断合法时,第三个参数为 " 类名::方法名 " 或 " 函数名 "如果失败返回的都是$name转为字符串的内容。


method_exists

检查类的方法是否存在

bool method_exists ($object, $method_name)

参数:$object 对象或类名字符串

$method_name 方法名字符串(只能为简单类型的变量,否则报错)

163545342.jpg

上面的结果是 bool(true) bool(true) bool(false)

只要第一个参数是可用的类名字符串或对象,第二个参数为类或对象包含的方法名字符串即返回真否则返回假。


function_exists

检查指定的函数是否已经定义

bool function_exists ($function_name)

参数:$function_name 函数名字符串

165113424.jpg

上面的结果是 bool(true) bool(false)

只要参数为可用的函数名返回真否则返回假。



到这里可以看出来is_callable是可以代替function_exists但不能代替method_exists(但可以作前期判断,否则程序易报错不具健全性,主要是因为is_callable并不判断方法是否为对象包含的)。