理解 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,不光要检测格式,还要检测内容是否真的存在,真的可被作为回调调用。
理解 is_callable的更多相关文章
- 深入理解is_callable和method_exists
一.函数解析 is_callable() 定义: (PHP 4 >= 4.0.6, PHP 5, PHP 7) is_callable — 检测参数是否为合法的可调用结构 bool is_cal ...
- 理解CSS视觉格式化
前面的话 CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...
- 彻底理解AC多模式匹配算法
(本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...
- 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信
接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念
一.前言 DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...
- 学习AOP之透过Spring的Ioc理解Advisor
花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...
- ThreadLocal简单理解
在java开源项目的代码中看到一个类里ThreadLocal的属性: private static ThreadLocal<Boolean> clientMode = new Thread ...
- JS核心系列:理解 new 的运行机制
和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 ...
随机推荐
- yarn-site.xml 基本配置参考
以下只是对yarn配置文件(yarn.site.xml)简单的一个配置 <configuration> <!-- rm失联后重新链接的时间 --> <property&g ...
- 小程序 image跟view标签上下会有间隙
图片文字等inline元素默许是跟父级元素的baseline对齐,而baseline又和父级底边有必定间距 我是使用: 加上这个消除了间隙,如果没有解决,你可以分别用 vertical-align:t ...
- select选中
比如<select class="selector"></select> 1.设置value为“全部“的项选中 复制代码代码如下: $(&quo ...
- Qt 中 Oracle 数据库 QOCI 驱动问题及解决
Qt 中 Oracle 数据库 QOCI 驱动问题及解决是本文要讲述的问题,用Qt开发Oracle程序时,常会遇到QOCI驱动问题,主要表现为程序运行时出现下面的错误. QOCI driver not ...
- leetcode 143. Reorder List 、86. Partition List
143. Reorder List https://www.cnblogs.com/grandyang/p/4254860.html 先将list的前半段和后半段分开,然后后半段进行逆序,然后再连接 ...
- The magic method __set() must have public visibility and cannot be static in
魔术方法 __set 用private 封装后出现问题 private function __set(){} 就是这个格式 10 错误信息就是这个:The magic method __set() m ...
- Cisco Port-Channel 设置(链路聚合--重点)
Port-Channel 的在实际工作中的主要作用是将两个或多个端口捆绑成为一个虚拟通道. interface Port-channel1 description port(1/0/5-6) swit ...
- 【421】C语言输入输出函数说明
目录: sscanf & sprintf scanf & printf getchar & putchar fgets & fputs fscanf & fpr ...
- html5调整音频音高
var audioSrc = 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/1715/the_xx_-_intro.mp3'; function buff ...
- tk mybatis动态sql中过滤不使用的字段
实体字段如下 @Data @NoArgsConstructor @AllArgsConstructor @Builder /*** * app图标 */ @JsonFormat public clas ...