详解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程序
Oct 09 PHP
用PHP4访问Oracle815
Oct 09 PHP
phpmail类发送邮件函数代码
Feb 20 PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 PHP
浅析51个PHP处理字符串的函数
Aug 02 PHP
PHP 实现类似js中alert() 提示框
Mar 18 PHP
php session的锁和并发
Jan 22 PHP
php安装扩展mysqli的实现步骤及报错解决办法
Sep 23 PHP
阿里云Win2016安装Apache和PHP环境图文教程
Mar 11 PHP
PHP使用文件锁解决高并发问题示例
Mar 29 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
Jan 23 PHP
laravel框架创建授权策略实例分析
Nov 22 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 is_file()和is_dir()用于遍历目录时用法注意事项
2010/03/02 PHP
php检查日期函数checkdate用法实例
2015/03/19 PHP
php实现二进制和文本相互转换的方法
2015/04/18 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
JS的数组的扩展实例代码
2008/07/09 Javascript
JavaScript 图片预览效果 推荐
2009/12/22 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
jquery实现点击页面计算点击次数
2015/01/23 Javascript
Javascript中的apply()方法浅析
2015/03/15 Javascript
浅谈JavaScript中setInterval和setTimeout的使用问题
2015/08/01 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
Bootstrap企业网站实战项目4
2016/10/14 Javascript
jquery使用EasyUI Tree异步加载JSON数据(生成树)
2017/02/11 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
Nodejs中获取当前函数被调用的行数及文件名详解
2018/12/12 NodeJs
微信小程序 可搜索的地址选择实现详解
2019/08/28 Javascript
Python脚本实现格式化css文件
2015/04/08 Python
如何在python中使用selenium的示例
2017/12/26 Python
Python建立Map写Excel表实例解析
2018/01/17 Python
使用Python处理Excel表格的简单方法
2018/06/07 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
python基础知识(一)变量与简单数据类型详解
2019/04/17 Python
pytorch中nn.Conv1d的用法详解
2019/12/31 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
2020/01/15 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
2021/03/04 Python
C面试题
2015/10/08 面试题
Hashtable 添加内容的方式有哪几种,有什么区别?
2012/04/08 面试题
初三家长会邀请函
2014/01/18 职场文书
乡镇网格化管理实施方案
2014/03/23 职场文书
党委领导班子整改方案
2014/09/30 职场文书
汽车转让协议书范本
2014/12/07 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript
学习nginx基础知识
2021/09/04 Servers
Python编程中内置的NotImplemented类型的用法
2022/03/23 Python
JavaScript获取URL参数的方法分享
2022/04/07 Javascript