详解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数组的几个基本操作
Jul 14 PHP
PHP中的错误处理、异常处理机制分析
May 07 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
Dec 11 PHP
利用curl 多线程 模拟 并发的详解
Jun 14 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
Apr 30 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
Jun 25 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
Mar 21 PHP
PHP下的浮点运算不准的解决方法
Oct 27 PHP
PHP简单获取随机数的常用方法小结
Jun 07 PHP
PHP rmdir()函数的用法总结
Jul 02 PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
Dec 30 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连接SQLSERVER 注意事项(附dll文件下载)
2012/06/28 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
2014/08/18 PHP
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
PHP常用字符串函数小结(推荐)
2018/08/05 PHP
Cookie跨域问题解决方案代码示例
2020/11/24 PHP
在js中单选框和复选框获取值的方式
2009/11/06 Javascript
JavaScript常用全局属性与方法记录积累
2013/07/03 Javascript
跟我学习javascript的执行上下文
2015/11/18 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
微信小程序 教程之注册程序
2016/10/17 Javascript
JavaScript创建对象的七种方式(推荐)
2017/06/26 Javascript
详解vue-cli 快速搭建单页应用之遇到的问题及解决办法
2018/03/01 Javascript
Vue利用canvas实现移动端手写板的方法
2018/05/03 Javascript
微信小程序实现购物车功能
2020/11/18 Javascript
[00:33]2018DOTA2亚洲邀请赛TNC出场
2018/04/04 DOTA
Python中Django 后台自定义表单控件
2017/03/28 Python
Python 读取某个目录下所有的文件实例
2018/06/23 Python
Python 分享10个PyCharm技巧
2019/07/13 Python
Pandas实现DataFrame按行求百分数(比例数)
2019/12/27 Python
Python调用shell cmd方法代码示例解析
2020/06/18 Python
Python Opencv图像处理基本操作代码详解
2020/08/31 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
2020/12/10 Python
利用html5 canvas动态画饼状图的示例代码
2018/04/02 HTML / CSS
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
Java面试题:为什么要用Java
2012/05/11 面试题
电子商务专业自我鉴定
2013/12/18 职场文书
服装设计师职业生涯规划范文
2014/02/28 职场文书
车队司机个人自我鉴定
2014/04/17 职场文书
技术合作协议书范本
2014/04/18 职场文书
2014年大学生党员自我评议
2014/09/22 职场文书
给领导敬酒词
2015/08/12 职场文书
节水宣传标语口号
2015/12/26 职场文书
2019年恭贺升学祝福语集锦
2019/08/15 职场文书
Mysql中有关Datetime和Timestamp的使用总结
2021/12/06 MySQL
JS实现数组去重的11种方法总结
2022/04/04 Javascript
ConditionalOnProperty配置swagger不生效问题及解决
2022/06/14 Java/Android