详解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 相关文章推荐
PHP4 与 MySQL 数据库操作函数详解
Dec 06 PHP
PHP Token(令牌)设计
Mar 15 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
Nov 07 PHP
php中使用redis队列操作实例代码
Feb 07 PHP
PHP采集类Snoopy抓取图片实例
Jun 19 PHP
ThinkPHP模板IF标签用法详解
Jul 01 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
Aug 18 PHP
Laravel实现用户注册和登录
Jan 23 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
Mar 18 PHP
php对文件夹进行相关操作(遍历、计算大小)
Nov 04 PHP
在WordPress的文章编辑器中设置默认内容的方法
Dec 29 PHP
PHP自动生成缩略图函数的源码示例
Mar 18 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
Codeigniter中集成smarty和adodb的方法
2016/03/04 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
JS时间选择器 兼容IE6,7,8,9
2012/06/26 Javascript
js加强的经典分页实例
2013/03/15 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
浅析BootStrap栅格系统
2016/06/07 Javascript
jQuery实现二维码扫描功能
2017/01/09 Javascript
Nodejs连接mysql并实现增、删、改、查操作的方法详解
2018/01/04 NodeJs
基于webpack-hot-middleware热加载相关错误的解决方法
2018/02/22 Javascript
微信小程序开发背景图显示功能
2018/08/08 Javascript
详解Vue前端生产环境发布配置实战篇
2019/05/07 Javascript
vue路由权限校验功能的实现代码
2020/06/07 Javascript
ubuntu安装mysql pycharm sublime
2018/02/20 Python
python 编码规范整理
2018/05/05 Python
使用python 3实现发送邮件功能
2018/06/15 Python
使用Python的toolz库开始函数式编程的方法
2018/11/15 Python
python判断列表的连续数字范围并分块的方法
2018/11/16 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
2018/12/19 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
2019/03/05 Python
django foreignkey外键使用的例子 相当于left join
2019/08/06 Python
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
HTML5头部标签的一些常用信息小结
2016/10/23 HTML / CSS
沙龙级头发造型工具:FOXYBAE
2018/07/01 全球购物
英国最全面的橄榄球联盟门票网站:Live Rugby Tickets
2018/10/06 全球购物
奥林匹亚体育:Olympia Sports
2020/12/30 全球购物
vue路由实现登录拦截
2021/03/24 Vue.js
幼师自荐信范文
2013/10/06 职场文书
化学教师教学反思
2014/01/17 职场文书
一年级班主任感言
2014/03/08 职场文书
法律七进实施方案
2014/03/15 职场文书
毕业论文评语大全
2014/04/29 职场文书
中国梦读书活动总结
2014/07/10 职场文书
2015年维修电工工作总结
2015/04/25 职场文书
小学运动会入场词
2015/07/18 职场文书
详解JavaScript中Arguments对象用途
2021/08/30 Javascript