详解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 相关文章推荐
PHP4实际应用经验篇(7)
Oct 09 PHP
PHP 设置MySQL连接字符集的方法
Jan 02 PHP
zend api扩展的php对象的autoload工具
Apr 18 PHP
ajax 的post方法实例(带循环)
Jul 04 PHP
一个PHP的QRcode类与大家分享
Nov 13 PHP
PHP中去掉字符串首尾空格的方法
May 19 PHP
查找mysql字段中固定字符串并替换的几个方法
Sep 23 PHP
xss防御之php利用httponly防xss攻击
Mar 21 PHP
PHP判断一个gif图片是否为动态图片的方法
Nov 19 PHP
PHP判断是否为空的几个函数对比
Apr 21 PHP
php metaphone()函数及php localeconv() 函数实例解析
May 15 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 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自定session保存路径及删除、注销与写入的方法
2014/11/18 PHP
php单例模式的简单实现方法
2016/06/10 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
PHP实现数组根据某个单元字段排序操作示例
2018/08/01 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
JavaScript实现页面5秒后自动跳转的方法
2015/04/16 Javascript
js实现类似菜单风格的TAB选项卡效果代码
2015/08/28 Javascript
Nodejs 搭建简单的Web服务器详解及实例
2016/11/30 NodeJs
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
JS检测window.open打开的窗口是否关闭
2017/06/25 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
vue2.0 根据状态值进行样式的改变展示方法
2018/03/13 Javascript
Vue中$refs的用法详解
2018/06/24 Javascript
bootstrapTable+ajax加载数据 refresh更新数据
2018/08/31 Javascript
VueJS 组件参数名命名与组件属性转化问题
2018/12/03 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
2018/12/09 Javascript
python开发之文件操作用法实例
2015/11/13 Python
python读取csv和txt数据转换成向量的实例
2019/02/12 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
PyTorch 对应点相乘、矩阵相乘实例
2019/12/27 Python
Python更新所有已安装包的操作
2020/02/13 Python
Pytorch对Himmelblau函数的优化详解
2020/02/29 Python
什么是python类属性
2020/06/10 Python
Django如何批量创建Model
2020/09/01 Python
python raise的基本使用
2020/09/10 Python
Scrapy实现模拟登录的示例代码
2021/02/21 Python
python实现杨辉三角的几种方法代码实例
2021/03/02 Python
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
英国折扣高尔夫商店:Discount Golf Store
2019/11/19 全球购物
金士达面试非笔试
2012/03/14 面试题
管理标语大全
2014/06/24 职场文书
助人为乐道德模范事迹材料
2014/08/16 职场文书
四风问题个人对照检查剖析材料
2014/09/27 职场文书
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python