详解php 使用Callable Closure强制指定回调类型


Posted in PHP onOctober 26, 2017

详解php 使用Callable Closure强制指定回调类型

如果一个方法需要接受一个回调方法作为参数,我们可以这样写

<?php 
function testCallBack($callback){ 
  call_user_func($callback); 
} 
 
function callback(){ 
  echo 'do sth callback'; 
} 
 
testCallBack('callback'); 
?>

但我们不能确定回调方法是否可以调用,因此需要做很多额外的工作去检查这个回调方法是否可以调用。

有什么更好的方法可以判断回调方法是否可调用?

我们可以使用callable来强制指定参数为回调类型,这样可以保证回调方法必须是可以调用的。

<?php 
function testCallBack($callback){ 
  call_user_func($callback); 
} 
 
function callback(){ 
  echo 'do sth callback'; 
} 
 
testCallBack('abc'); 
?>

执行后,提示警告:Warning: call_user_func() expects parameter 1 to be a valid callback, function ‘abc' not found or invalid function name 程序能执行到dosth内部的处理,这样就需要做很多额外的工作去检查这个回调方法是否可以调用。

<?php 
function testCallBack(callable $callback){ 
  call_user_func($callback); 
} 
 
function callback(){ 
  echo 'do sth callback'; 
} 
 
testCallBack('abc'); 
?>

执行后,提示错误:TypeError: Argument 1 passed to testCallBack() must be callable 程序并不能执行到dosth内部的处理,从参数类型处就已经做了检查处理,起到保护作用。

<?php 
$f = function () { 
  return 100; 
}; 
 
function testClosure(Closure $callback) { 
  return $callback(); 
} 
 
$a = testClosure($f); 
print_r($a); //100 
exit;

因此,如果方法的参数是回调方法,都应加上callable强制指定为回调类型,这样可以减少调用的错误和提高程序的质量。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
一个php作的文本留言本的例子(六)
Oct 09 PHP
PHP 源代码压缩小工具
Dec 22 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
Dec 30 PHP
PHP无限分类(树形类)
Sep 28 PHP
PHP APC缓存配置、使用详解
Mar 06 PHP
php动态生成函数示例
Mar 21 PHP
php中heredoc与nowdoc介绍
Dec 25 PHP
理解php依赖注入和控制反转
May 11 PHP
PHP封装的MSSql操作类完整实例
May 26 PHP
php封装json通信接口详解及实例
Mar 07 PHP
Yii2框架中日志的使用方法分析
May 22 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
php静态成员方法和静态的成员属性的使用方法
Oct 26 #PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
Oct 26 #PHP
利用php获得flv视频长度的实例代码
Oct 26 #PHP
PHP 中魔术常量的实例详解
Oct 26 #PHP
yii框架redis结合php实现秒杀效果(实例代码)
Oct 26 #PHP
PHP对象的浅复制与深复制的实例详解
Oct 26 #PHP
PHP中的浅复制与深复制的实例详解
Oct 26 #PHP
You might like
使用php判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
Yii框架实现邮箱激活的方法【数字签名】
2016/10/18 PHP
php封装的mysqli类完整实例
2016/10/18 PHP
简单谈谈 php 文件锁
2017/02/19 PHP
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
2007/02/22 Javascript
javascript控制swfObject应用介绍
2012/11/29 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
在Ubuntu系统上安装Node.JS的教程
2015/10/15 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
2015/12/08 Javascript
javascript html5实现表单验证
2016/03/01 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
2017/02/14 Javascript
浅谈原生JS中的延迟脚本和异步脚本
2017/07/12 Javascript
vue axios 二次封装的示例代码
2017/12/08 Javascript
vue实现简单的日历效果
2020/09/24 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
[57:22]完美世界DOTA2联赛PWL S2 FTD vs PXG 第二场 11.27
2020/12/01 DOTA
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
python使用matplotlib绘制柱状图教程
2017/02/08 Python
python如何定义带参数的装饰器
2018/03/20 Python
python3使用SMTP发送简单文本邮件
2018/06/19 Python
使用python实现mqtt的发布和订阅
2019/05/05 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
2019/06/28 Python
Python爬虫动态ip代理防止被封的方法
2019/07/07 Python
Python 写了个新型冠状病毒疫情传播模拟程序
2020/02/14 Python
python中的django是做什么的
2020/07/31 Python
canvas绘制图片drawImage使用方法
2020/09/15 HTML / CSS
Hotels.com越南:酒店预订
2019/10/29 全球购物
乌克兰的第一家手表店:Deka
2020/03/05 全球购物
"火柴棍式"程序员面试题
2014/03/16 面试题
毕业生自荐书
2013/12/18 职场文书
2013年军训通讯稿
2014/02/05 职场文书
2015年调度员工作总结
2015/04/30 职场文书
小学班级口号大全
2015/12/25 职场文书
详解Mysql 函数调用优化
2021/04/07 MySQL
浅析NIO系列之TCP
2021/06/15 Java/Android
Python requests用法和django后台处理详解
2022/03/19 Python