详解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 图片上传实现代码 带详细注释
Apr 29 PHP
PHP下常用正则表达式整理
Oct 26 PHP
解析PHP生成静态html文件的三种方法
Jun 18 PHP
php操作mysql数据库的基本类代码
Feb 25 PHP
PHP的文件操作与算法实现的面试题示例
Aug 10 PHP
Yii2第三方类库插件Imagine的安装和使用
Jul 06 PHP
visual studio code 调试php方法(图文详解)
Sep 15 PHP
php取出数组单个值的方法
Mar 12 PHP
PHP手机短信验证码实现流程详解
May 17 PHP
thinkPHP框架实现的短信接口验证码功能示例
Jun 20 PHP
基于laravel where的高级使用方法
Oct 10 PHP
laravel请求参数校验方法
Oct 10 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 Rename 更改文件、文件夹名称
2011/05/24 PHP
PHP服务器页面间跳转实现方法
2012/08/02 PHP
php利用单例模式实现日志处理类库
2014/02/10 PHP
thinkphp的c方法使用示例
2014/02/24 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
2019/10/15 PHP
可实现多表单提交的javascript函数
2007/08/01 Javascript
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
js修改table中Td的值(定义td的单击事件)
2013/01/10 Javascript
JavaScript将一个数组插入到另一个数组的方法
2015/03/19 Javascript
JS实现为排序好的字符串找出重复行的方法
2016/03/02 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
2019/09/05 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
JS实现音乐导航特效
2020/01/06 Javascript
关于Python 3中print函数的换行详解
2017/08/08 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
2019/03/22 Python
Python3.5面向对象编程图文与实例详解
2019/04/24 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
TensorBoard 计算图的可视化实现
2020/02/15 Python
Python新手学习raise用法
2020/06/03 Python
python爬虫要用到的库总结
2020/07/28 Python
CSS3效果:自定义“W”形运行轨迹实例
2017/03/29 HTML / CSS
HTML5 manifest离线缓存的示例代码
2018/08/08 HTML / CSS
美国汽车交易网站:Edmunds
2016/08/17 全球购物
Ryderwear美国官网:澳大利亚高端健身训练装备品牌
2018/04/24 全球购物
英国领先的体验日提供商:Buyagift
2019/04/19 全球购物
大学生毕业求职的自我评价
2013/09/29 职场文书
信息管理员岗位职责
2013/12/01 职场文书
搞笑创意广告语
2014/03/17 职场文书
检讨书范文300字
2015/01/28 职场文书
统计员岗位职责
2015/02/11 职场文书
某某幼儿园的教育教学管理调研分析报告
2019/11/29 职场文书
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python
Python Django ORM连表正反操作技巧
2021/06/13 Python
Python实现批量自动整理文件
2022/03/16 Python