详解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
安装APACHE
Jan 15 PHP
snoopy 强大的PHP采集类使用实例代码
Dec 09 PHP
zend framework多模块多布局配置
Feb 26 PHP
php中instanceof 与 is_a()区别分析
Mar 03 PHP
如何实现php图片等比例缩放
Jul 28 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
Jul 14 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
php curl优化下载微信头像的方法总结
Sep 07 PHP
Yii2框架加载css和js文件的方法分析
May 25 PHP
TP5框架实现一次选择多张图片并预览的方法示例
Apr 04 PHP
PHP笛卡尔积实现原理及代码实例
Dec 09 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
通过ODBC连接的SQL SERVER实例
2006/10/09 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
php实现连接access数据库并转txt写入的方法
2017/02/08 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
2019/12/31 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
2020/04/13 PHP
关于URL中的特殊符号使用介绍
2011/11/03 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
用NODE.JS中的流编写工具是要注意的事项
2016/03/01 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
详解Vue.js搭建路由报错 router.map is not a function
2017/06/27 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
vue.js异步上传文件前后端实现代码
2017/08/22 Javascript
从零开始在NPM上发布一个Vue组件的方法步骤
2018/12/20 Javascript
Vue2 添加数据可视化支持的方法步骤
2019/01/02 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
Python 开发Activex组件方法
2009/11/08 Python
python使用PythonMagick将jpg图片转换成ico图片的方法
2015/03/26 Python
Python中处理时间的几种方法小结
2015/04/09 Python
python利用matplotlib库绘制饼图的方法示例
2016/12/18 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
Python图片处理模块PIL操作方法(pillow)
2020/04/07 Python
Python Excel vlookup函数实现过程解析
2020/06/22 Python
哥伦比亚加拿大官网:Columbia Sportswear Canada
2020/09/07 全球购物
函授大学生自我鉴定
2014/02/05 职场文书
小学生评语集锦
2014/04/18 职场文书
文明之星事迹材料
2014/05/09 职场文书
施工安全承诺书
2014/05/22 职场文书
2015年八一建军节慰问信
2015/03/23 职场文书
再读《皇帝的新衣》的读后感悟!
2019/08/07 职场文书
Springboot配置suffix指定mvc视图的后缀方法
2021/07/03 Java/Android
sqlserver连接错误之SQL评估期已过的问题解决
2022/03/23 SQL Server