PHP匿名函数(闭包函数)详解


Posted in PHP onMarch 22, 2019

在PHP中匿名函数(Anonymous functions),也叫闭包函数( closures ),允许临时创建一个没有指定名称的函数。经常用作回调函数(callback)的参数。 当然,也有其他应用的情况。

注:php闭包是PHP5.3版本之后才有的

什么是闭包?闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。 在编程领域我们可以通俗的说:子函数可以使用父函数中的局部变量,这种行为就叫做闭包。

PHP匿名函数和闭包使用的句法与普通函数相同,但匿名函和闭包数其实是伪装成函数的对象.

匿名函数:就是没有名称的函数.匿名函数可以赋值给变量,对象传递.不过匿名函数仍是函数,因此可以调用,还可以传入参数.匿名函数特别适合作为函数或方法的回调.

闭包:是指在创建时封装周围状态的函数.即使闭包所在的环境不存在了,闭包中封装的状态依然存在.

注意:理论上讲,闭包和匿名函数是不同的概念. 不过,PHP将其视作相同的概念.

闭包的语法相当简单,需要注意的关键字就只有use,use是连接闭包和外界变量。

$a = function() use($b) {
 //TO-DO
};

下面给几个实现闭包的一个例子:

//例一:把匿名函数当做参数传递,并且调用它
function callFunc( $func ) {
  $func( "some string\r\n" );
}
$printStrFunc = function( $str ) {
  echo $str;
};
//例二:也可以直接将匿名函数进行传递。如果你了解js,这种写法可能会很熟悉
callFunc( $printStrFunc );
callFunc( function( $str ) {
  echo $str;
} );
//例三 :连接闭包和外界变量的关键字:USE
function getMoney() {
 $rmb = 1;
 $dollar = 6;
 $func = function() use ( $rmb ) {
  echo $rmb;
  echo $dollar;
 };
 $func();
}
getMoney();
//输出:1
//报错,找不到dorllar变量
//例四:在匿名函数中改变上下文的变量
function getMoney() {
  $rmb = 1;
  $func = function() use ( &$rmb ) {
   echo $rmb . "<br>";
     //把$rmb的值加1
   $rmb++;
 };
 $func();
 echo $rmb;
}
getMoney();
//输出:
//1
//2

闭包虽然语法和实现非常简单,但是用好却不易。

用好闭包,可以帮我们

  • 1 减少foreach的循环的代码
  • 2 减少函数的参数
  • 3 解除递归函数

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
PHP学习之正则表达式
Apr 17 PHP
php笔记之:AOP的应用
Apr 24 PHP
修改php.ini不生效问题解决方法(上传大于8M的文件)
Jun 14 PHP
解析php做推送服务端实现ios消息推送
Jul 01 PHP
php获取远程图片体积大小的实例
Nov 12 PHP
php字符串按照单词进行反转的方法
Mar 14 PHP
php实现简单的MVC框架实例
Sep 23 PHP
Linux安装配置php环境的方法
Jan 14 PHP
PHP对称加密函数实现数据的加密解密
Oct 27 PHP
PHP结合Vue实现滚动底部加载效果
Dec 17 PHP
PHP设计模式之建造者模式定义与用法简单示例
Aug 13 PHP
php框架知识点的整理和补充
Mar 01 PHP
PHP利用递归函数实现无限级分类的方法
Mar 22 #PHP
用PHP的反射实现委托模式的讲解
Mar 22 #PHP
PHP读取目录树的实现方法分析
Mar 22 #PHP
针对PHP开发安全问题的相关总结
Mar 22 #PHP
浅谈PHP中的Trait使用方法
Mar 22 #PHP
PHP观察者模式定义与用法实例分析
Mar 22 #PHP
wordpress自定义标签云与随机获取标签的方法详解
Mar 22 #PHP
You might like
PHP下一个非常全面获取图象信息的函数
2008/11/20 PHP
ThinkPHP实现多数据库连接的解决方法
2014/07/01 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
php+croppic.js实现剪切上传图片功能
2018/08/14 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
Extjs4 类的定义和扩展实例
2013/06/28 Javascript
JS实现定时页面弹出类似QQ新闻的提示框
2013/11/07 Javascript
jQuery操作Select的Option上下移动及移除添加等等
2013/11/18 Javascript
JS实现点击按钮控制Div变宽、增高及调整背景色的方法
2015/08/05 Javascript
jquery仿QQ登录账号选择下拉框效果
2016/03/22 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
2016/07/20 Javascript
浅谈JS中String()与 .toString()的区别
2016/10/20 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
React key值的作用和使用详解
2018/08/23 Javascript
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
layui自定义ajax左侧三级菜单
2019/07/26 Javascript
jquery实现进度条状态展示
2020/03/26 jQuery
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
如何用python整理附件
2018/05/13 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
2019/09/16 Python
python安装本地whl的实例步骤
2019/10/12 Python
python统计字符串中字母出现次数代码实例
2020/03/02 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
Html5页面在微信端的分享的实现方法
2018/08/30 HTML / CSS
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
C和C++经典笔试题附答案解析
2014/08/18 面试题
机械电子工程毕业生自荐信
2013/11/23 职场文书
事业单位考核材料
2014/05/21 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
2016春季幼儿园开学寄语
2015/12/03 职场文书
励志语录:只有自己足够强大,才能不被别人践踏
2020/01/09 职场文书
MySQL5.7并行复制原理及实现
2021/06/03 MySQL
Java实现带图形界面的聊天程序
2022/06/10 Java/Android