详解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生成WAP页面
Oct 09 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
Mar 01 PHP
php自动加载机制的深入分析
Jun 08 PHP
php curl_init函数用法
Jan 31 PHP
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
Aug 21 PHP
PHP中的魔术方法总结和使用实例
May 11 PHP
4种PHP异步执行的常用方式
Dec 24 PHP
PHP面向对象自动加载机制原理与用法分析
Oct 14 PHP
PHP验证码无法显示的原因及解决办法
Aug 11 PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 PHP
php表单处理操作
Nov 16 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
Oct 23 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
apache rewrite_module模块使用教程
2008/01/10 PHP
php daddslashes()和 saddslashes()有哪些区别分析
2012/10/26 PHP
php+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
Symfony2联合查询实现方法
2016/03/18 PHP
YUI 读码日记之 YAHOO.util.Dom - Part.1
2008/03/22 Javascript
JavaScript 仿关机效果的图片层
2008/12/26 Javascript
javascript中的new使用
2010/03/20 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
2013/01/15 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
2014/09/02 Javascript
jQuery消息提示框插件Tipso
2015/05/04 Javascript
JavaScript中的Math.E属性使用详解
2015/06/12 Javascript
每天一篇javascript学习小结(面向对象编程)
2015/11/20 Javascript
js实现的彩色方块飞舞奇幻效果
2016/01/27 Javascript
js绘制购物车抛物线动画
2020/11/18 Javascript
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
微信小程序常用简易小函数总结
2019/02/01 Javascript
利用layer实现表单完美验证的方法
2019/09/26 Javascript
跟老齐学Python之模块的加载
2014/10/24 Python
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
使用Python实现微信提醒备忘录功能
2018/12/04 Python
对Python之gzip文件读写的方法详解
2019/02/08 Python
Django 开发环境配置过程详解
2019/07/18 Python
python进阶之自定义可迭代的类
2019/08/20 Python
Python从文件中读取指定的行以及在文件指定位置写入
2019/09/06 Python
python实现梯度法 python最速下降法
2020/03/24 Python
如何利用python web框架做文件流下载的实现示例
2020/06/02 Python
html5 乒乓球(碰撞检测)实例二
2013/07/25 HTML / CSS
技术总监的工作职责
2013/11/13 职场文书
玲玲的画教学反思
2014/02/04 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
领导干部群众路线教育实践活动剖析材料
2014/10/10 职场文书
学校机关党总支领导班子整改工作方案
2014/10/26 职场文书
导游词之五台山
2019/10/11 职场文书
MySQL中你可能忽略的COLLATION实例详解
2021/05/12 MySQL
HTML5之高度塌陷问题的解决
2022/06/01 HTML / CSS