详解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语法(1)
Oct 09 PHP
一个简单的自动发送邮件系统(二)
Oct 09 PHP
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
May 26 PHP
php设计模式 Builder(建造者模式)
Jun 26 PHP
PHP 循环删除无限分类子节点的实现代码
Jun 21 PHP
PHP实现微信公众平台音乐点播
Mar 20 PHP
php实例分享之二维数组排序
May 15 PHP
ThinkPHP CURD方法之page方法详解
Jun 18 PHP
destoon实现调用图文新闻的方法
Aug 21 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
Sep 23 PHP
php使用CURL伪造IP和来源实例详解
Jan 15 PHP
thinkPHP框架实现多表查询的方法
Jun 14 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+javascript模拟Matrix画面
2006/10/09 PHP
php 调用远程url的六种方法小结
2009/11/02 PHP
php下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
深入分析PHP引用(&amp;)
2014/09/04 PHP
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
2018/05/23 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
javascript AutoScroller 函数类
2009/05/29 Javascript
表单验证的完整应用案例探讨
2013/03/29 Javascript
javascript中键盘事件用法实例分析
2015/01/30 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
使用PBFunc在Powerbuilder中支付宝当面付款功能
2016/10/01 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
Bootstrap导航条学习使用(二)
2017/02/08 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
微信小程序之获取当前位置经纬度以及地图显示详解
2017/05/09 Javascript
Vue中之nextTick函数源码分析详解
2017/10/17 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
vue脚手架中配置Sass的方法
2018/01/04 Javascript
vue中的过滤器实例代码详解
2019/06/06 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
python+VTK环境搭建及第一个简单程序代码
2017/12/13 Python
使用python实现ANN
2017/12/20 Python
python使用selenium实现批量文件下载
2019/03/11 Python
使用npy转image图像并保存的实例
2020/07/01 Python
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
电子商务专业学生的自我鉴定
2013/11/28 职场文书
展会邀请函范文
2014/01/26 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
民事诉讼代理委托书
2014/10/08 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers