详解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手册及PHP编程标准
Dec 17 PHP
PHP 柱状图实现代码
Dec 04 PHP
PHP中的多行字符串传递给JavaScript的两种方法
Jun 19 PHP
PHP多个文件上传到服务器实例
Oct 29 PHP
thinkPHP使用post方式查询时分页失效的解决方法
Dec 09 PHP
PHP实现文件上传和多文件上传
Dec 24 PHP
PHP获取二维数组中某一列的值集合
Dec 25 PHP
基于PHP实现商品成交时发送短信功能
May 11 PHP
PHP chop()函数讲解
Feb 11 PHP
Laravel框架Auth用户认证操作实例分析
Sep 29 PHP
Mac下关于PHP环境和扩展的安装详解
Oct 17 PHP
laravel model 两表联查示例
Oct 24 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变量引用的面试题
2010/08/08 PHP
php截取html字符串及自动补全html标签的方法
2015/01/15 PHP
5款适合PHP使用的HTML编辑器推荐
2015/07/03 PHP
浅析Yii2 gridview实现批量删除教程
2016/04/22 PHP
php基于curl实现的股票信息查询类实例
2016/11/11 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
PHP http请求超时问题解决方案
2020/11/13 PHP
XRegExp 0.2: Now With Named Capture
2007/11/30 Javascript
js获取指定日期前后的日期代码
2013/08/20 Javascript
使用jsonp完美解决跨域问题
2014/11/27 Javascript
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
Javascript获取统一管理的提示语(message)
2016/02/03 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
2017/07/24 Javascript
JS实现自定义状态栏动画文字效果示例
2017/10/12 Javascript
实例详解vue.js浅度监听和深度监听及watch用法
2018/08/16 Javascript
详解vuex 渐进式教程实例代码
2018/11/27 Javascript
深入理解js A*寻路算法原理与具体实现过程
2018/12/13 Javascript
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
python实现k-means聚类算法
2018/02/23 Python
python去除文件中重复的行实例
2018/06/29 Python
浅析python继承与多重继承
2018/09/13 Python
python 批量解压压缩文件的实例代码
2019/06/27 Python
OpenCV 边缘检测
2019/07/10 Python
实现Python与STM32通信方式
2019/12/18 Python
Pygame的程序开始示例代码
2020/05/07 Python
Python基于BeautifulSoup爬取京东商品信息
2020/06/01 Python
python用什么编辑器进行项目开发
2020/06/17 Python
IRO美国官网:法国服装品牌
2018/03/06 全球购物
Juicy Couture Beauty官方网站:香水和化妆品
2019/03/12 全球购物
STP的判定过程
2012/10/01 面试题
医学毕业生自我鉴定
2013/10/30 职场文书
党委干部批评与自我批评发言稿
2014/09/28 职场文书
如何写辞职信
2015/05/13 职场文书