详解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发明人谈MVC和网站设计架构 貌似他不支持php用mvc
Jun 04 PHP
php whois查询API制作方法
Jun 23 PHP
PHP随机字符串生成代码(包括大小写字母)
Jun 24 PHP
apache中为php 设置虚拟目录
Dec 17 PHP
php安装swoole扩展的方法
Mar 19 PHP
php获得网站访问统计信息类Compete API用法实例
Apr 02 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
May 20 PHP
Yii统计不同类型邮箱数量的方法
Oct 18 PHP
php实现购物车产品删除功能(2)
Jul 23 PHP
Laravel框架路由和控制器的绑定操作方法
Jun 12 PHP
Laravel 自定命令以及生成文件的例子
Oct 23 PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
Aug 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
图书管理程序(二)
2006/10/09 PHP
php Smarty date_format [格式化时间日期]
2010/03/15 PHP
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
2013/07/01 PHP
单点登录 Ucenter示例分析
2013/10/29 PHP
php生成二维码
2015/08/10 PHP
PHP list() 将数组中的值赋给变量的简单实例
2016/06/13 PHP
微信封装的调用微信签名包的类库
2017/06/08 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
document.documentElement的一些使用技巧
2013/04/18 Javascript
超链接的禁用属性Disabled使用示例
2014/07/31 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
js实现点击链接后延迟3秒再跳转的方法
2015/06/05 Javascript
jQuery实现验证年龄简单思路
2016/02/24 Javascript
详解nodejs微信公众号开发——4.自动回复各种消息
2017/04/11 NodeJs
基于JavaScript实现的折半查找算法示例
2017/04/14 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
Javascript中的作用域及块级作用域
2017/12/08 Javascript
微信小程序全局变量改变监听的实现方法
2019/07/15 Javascript
JsonServer安装及启动过程图解
2020/02/28 Javascript
对Python3中的input函数详解
2018/04/22 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
Python多分支if语句的使用
2020/09/03 Python
Python3使用 GitLab API 进行批量合并分支
2020/10/15 Python
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
使用canvas一步步实现图片打码功能的方法
2019/06/17 HTML / CSS
贪睡宠物用品:Snoozer Pet Products
2020/02/04 全球购物
服装店营销方案
2014/03/10 职场文书
取保候审保证书
2014/04/30 职场文书
党员廉洁自律承诺书
2014/05/26 职场文书
ktv周年庆活动方案
2014/08/18 职场文书
如何写早恋检讨书
2014/09/10 职场文书
村主任个人对照检查材料
2014/10/01 职场文书
2014年学生会工作总结
2014/11/07 职场文书
初三英语教学计划
2015/01/23 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书