官方解释:


(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的更多相关文章

  1. 深入理解is_callable和method_exists

    一.函数解析 is_callable() 定义: (PHP 4 >= 4.0.6, PHP 5, PHP 7) is_callable — 检测参数是否为合法的可调用结构 bool is_cal ...

  2. 理解CSS视觉格式化

    前面的话   CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...

  3. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  4. 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信

    接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...

  5. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  6. 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念

    一.前言     DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...

  7. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  8. ThreadLocal简单理解

    在java开源项目的代码中看到一个类里ThreadLocal的属性: private static ThreadLocal<Boolean> clientMode = new Thread ...

  9. JS核心系列:理解 new 的运行机制

    和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 ...

随机推荐

  1. 2019CSP-S初赛知识点汇总

    0x00 基本算法 0x01 位运算 0x02 前缀和与差分 0x03 二分 0x04 倍增 0x05 排序 0x06 离散化 0x07 高精度 0x10 数据结构 0x11 栈和队列 0x12 链表 ...

  2. 在使用avalon框架的时候,用ms-duplex双工绑定,在template上是有数据渲染的,但是js里面却是undefined

    controller绑定是用于圈定某个VM的作用域范围,因为有的页面,你用的对象一致,而这两个作用域里面有相同的数据,那么很有可能是另一个作用域里面的东西影响了这个作用域,所以在指定作用域的给不同的命 ...

  3. arcgis python 发送邮件

    import arcgisscripting, smtplib, os, sys, traceback from email.MIMEMultipart import MIMEMultipart fr ...

  4. Get Argument Values From Linq Expression

    Get Argument Values From Linq Expression If you even find yourself unpacking an expression in C#, yo ...

  5. STM32F429中LTDC的DMA2D加速

    液晶屏的时序问题?每个液晶屏的时序都不一样,但总体上是类似的.如下图: VDEN:    数据使能信号.HSYNC:     每一行扫描的起始点, 在扫描过程中, 不会管上一行扫描有没有结束, 当出现 ...

  6. Vue——路由:登录状态的判断

    在搭建的系统中,最基本的登录都是必须的,结合Vue的路由,涉及最多的就是登录状态的判断.也就是说,如果一个组件要校验登录状态,则在用户初始进入时,就要去判断用户是否登录,这里的校验登录状态就是本篇的重 ...

  7. 猎豹网校C++ Primer学习笔记

    1.头文件(15th课) 大型项目开发,要有很多头文件.只能写声明,不能定义(类定义和常量定义可以). 自己新建头文件(类定义,外部变量声明,函数声明).源文件包含对应的头文件. 头文件里写类的声明, ...

  8. OSG 遍历fbx节点

    count:560 construction_worker 4294967295 osg::MatrixTransform1 Bip001 L Finger02 4294967295 osg::Mat ...

  9. 阶段5 3.微服务项目【学成在线】_day18 用户授权_12-前端集成认证授权-携带JWT授权

    携带JWT授权 登陆后jwt已经存到了sessionStorage里面 当进行微服务的请求就要携带令牌.我们在拦截器里面做文章. 在axios的intercepters拦截器上 手工的给这个课程 造一 ...

  10. unique_ptr智能指针

    一.VS例子 // Test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <thread> #includ ...