理解 is_callable

官方解释:


 

(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,不光要检测格式,还要检测内容是否真的存在,真的可被作为回调调用。

 

posted on 2019-05-22 12:33  追风的浪子  阅读(...)  评论(... 编辑 收藏

导航