详解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 06 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
Dec 08 PHP
php页面消耗内存过大的处理办法
Mar 18 PHP
php 中文字符串首字母的获取函数分享
Nov 04 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
Jan 31 PHP
php简单解析mysqli查询结果的方法(2种方法)
Jun 29 PHP
PHP简单获取网站百度搜索和搜狗搜索收录量的方法
Aug 23 PHP
PHP实现权限管理功能示例
Sep 22 PHP
phpStudy 2016 使用教程详解(支持PHP7)
Oct 18 PHP
Laravel框架路由和控制器的绑定操作方法
Jun 12 PHP
微信JSSDK分享功能图文实例详解
Apr 08 PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
May 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
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
2014/05/06 PHP
Smarty环境配置与使用入门教程
2016/05/11 PHP
javascript获取选中的文本的方法代码
2013/10/30 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
基于Jquery实现仿百度百科右侧导航代码附源码下载
2015/11/27 Javascript
JS创建对象几种不同方法详解
2016/03/01 Javascript
Node.js模块封装及使用方法
2016/03/06 Javascript
javascript常用的设计模式
2017/02/09 Javascript
详解angularjs利用ui-route异步加载组件
2017/05/21 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
2017/08/01 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
解决vue中修改export default中脚本报一大堆错的问题
2018/08/27 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
Python快速排序算法实例分析
2017/11/29 Python
Flask框架Flask-Principal基本用法实例分析
2018/07/23 Python
python简单验证码识别的实现方法
2019/05/10 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
使用python实现多维数据降维操作
2020/02/24 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
详解Python高阶函数
2020/08/15 Python
Django mysqlclient安装和使用详解
2020/09/17 Python
在家更换处方镜片:Lensabl
2019/05/01 全球购物
酷瑞网络科技面试题
2012/03/30 面试题
高三体育教学反思
2014/01/29 职场文书
演讲主持词
2014/03/18 职场文书
和睦家庭事迹
2014/05/14 职场文书
领导干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
区政府领导班子个人对照检查材料
2014/09/25 职场文书
六五普法宣传标语
2014/10/06 职场文书
2016元旦晚会主持词
2015/07/01 职场文书
微信小程序中使用vant框架的具体步骤
2022/02/18 Javascript
python 镜像环境搭建总结
2022/09/23 Python