(PHP 4 >= 4.0.6, PHP 5, PHP 7)
is_callable — 检测参数是否为合法的可调用结构。
is_callable ( callable $name [, bool $syntax_only = false [, string &$callable_name ]] ) : bool
验证变量的内容能否作为函数调用。 这可以检查包含有效函数名的变量,或者一个数组(包含了正确编码的对象以及函数名,即称为对象数组)。
name
要检查的回调函数。
syntax_only
如果设置为 TRUE
,这个函数仅仅验证 name
可能是函数或方法。 它仅仅拒绝非字符,或者未包含能用于回调函数的有效结构。有效的应该包含两个元素,第一个是一个对象或者字符,第二个元素是个字符。
callable_name
接受“可调用的名称”。下面的例子是“someClass::someMethod”。 注意,尽管 someClass::SomeMethod() 的含义是可调用的静态方法,但例子的情况并不是这样的。
如果 name
可调用则返回 TRUE
,否则返回 FALSE
。
怎么真正理解第二个参数,syntax_only。例子说明,如下:
例1.
判断一个已定义的函数,判断一个函数名的字符串
function f(){}
//f为函数名 var_dump(is_callable(‘f‘, false)); // bool(true) var_dump(is_callable(‘f‘, true)); // bool(true)
总结:判断一个已定义的函数时,通过函数名判断即可,不管第二个参数为 true ,还是false, is_callable返回值都为true.
例2.
只检测格式,不检测具体内容
//第2个参数为false,如果第一个参数是字符串,则需要检测函数是否存在
var_dump(is_callable(‘不是方法名的字符串‘, false)); // bool(false)
//第2个参数为true,只检测格式(字符串或者数组)即可,不检测内容是否真的存在,或者可被调用
var_dump(is_callable(‘不是方法名的字符串‘, true)); // bool(true)
//第2个参数为false,如果第一个参数是数组,则需要检测数组是否是可调用的对象数组
var_dump(is_callable( array(‘随便写,不是对象‘, ‘随便写,不是对象的方法名‘), false)); // bool(false)
//第2个参数为true,只检测格式(字符串或者数组)即可,不检测内容是否真的存在,或者可被调用
var_dump(is_callable( array(‘随便写,不是对象‘, ‘随便写,不是对象的方法名‘), true)); // bool(true)
这里直接判断一个普通的字符串(非函数名),可以看见第二个参数的不同,返回的结果也不同。当第2个参数设置为true时,只要参数1是可能被调用的结构即可(字符串,或者数组),is_callable就返回true.
总结:第2个参数为true时,不会去检查是否字串对应的函数是否真的存在,或者 数组对应的对象数组格式是否真的存在,而是检查只要是字符串格式(函数名),或者 数组格式(数组对象)即可,也就是只是检查是否是满足条件的格式
简单来说,就是第二个参数为true时,只检查格式,不检测内容(是否真的存在,是否真的可被调用)
例3.
严格检测具体内容,第2个参数设置为false
function f(){} class someClass { function someMethod() { } } $anObject = new someClass(); //普通字符串(非函数名)格式 var_dump(is_callable(‘不是方法名的字符串‘, false)); // bool(false) //函数名字符串 var_dump(is_callable(‘f‘, false)); // bool(true) //数组格式 var_dump(is_callable( array(‘随便写,不是对象‘, ‘随便写,不是对象的方法名‘), false)); // bool(false) //类名-方法数组格式 var_dump(is_callable( array(‘someClass‘, ‘someMethod‘), false)); // bool(true) //对象-方法数组格式 var_dump(is_callable( array($anObject, ‘someMethod‘), false)); // bool(true)
总结:第2个参数设置为false,默认值为false,不光要检测格式,还要检测内容是否真的存在,真的可被作为回调调用。
原文:https://www.cnblogs.com/echojson/p/10905228.html