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程序
Oct 09 PHP
怎样去阅读一份php源代码
Aug 21 PHP
php 获取客户端的真实ip
Nov 30 PHP
php 上传功能实例代码
Apr 13 PHP
php设计模式 Bridge (桥接模式)
Jun 26 PHP
去除php注释和去除空格函数分享
Mar 13 PHP
Codeigniter实现多文件上传并创建多个缩略图
Jun 12 PHP
yii实现创建验证码实例解析
Jul 31 PHP
php获得文件大小和文件创建时间的方法
Mar 13 PHP
php实现将任意进制数转换成10进制的方法
Apr 17 PHP
PHP7引入的&quot;??&quot;和&quot;?:&quot;的区别讲解
Apr 08 PHP
浅析PHP中的 inet_pton 网络函数
Dec 16 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 eval函数用法 PHP中eval()函数小技巧
2012/10/31 PHP
php输出1000以内质数(素数)示例
2014/02/16 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
如何用PHP做到页面注册审核
2017/03/02 PHP
js静态作用域的功能。
2006/12/25 Javascript
用javascript自动显示最后更新时间
2007/03/15 Javascript
Javascript 倒计时源代码.(时.分.秒) 详细注释版
2011/05/09 Javascript
jquery设置元素的readonly和disabled的写法
2013/09/22 Javascript
js动态添加事件并可传参数示例代码
2013/10/21 Javascript
JS小游戏之宇宙战机源码详解
2014/09/25 Javascript
浅谈JavaScript的Polymer框架中的事件绑定
2015/07/29 Javascript
高性能JavaScript DOM编程(1)
2015/08/11 Javascript
jQuery实现页面评论栏中访客信息自动填写功能的方法
2016/05/23 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
2016/10/05 Javascript
bootstrap输入框组件使用方法详解
2017/01/19 Javascript
微信小程序使用Socket的实例
2017/09/19 Javascript
微信小程序实现页面浮动导航
2019/01/28 Javascript
微信小程序云开发之模拟后台增删改查
2019/05/16 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
微信小程序组件传值图示过程详解
2019/07/31 Javascript
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
JS函数本身的作用域实例分析
2020/03/16 Javascript
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
[11:33]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第二场
2018/04/06 DOTA
Python中os和shutil模块实用方法集锦
2014/05/13 Python
Python unittest单元测试框架总结
2018/09/08 Python
浅析python内置模块collections
2019/11/15 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
python批量修改xml属性的实现方式
2020/03/05 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
Python绘制K线图之可视化神器pyecharts的使用
2021/03/02 Python
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
2014年计算机专业个人自我评价
2014/01/19 职场文书
2014小学植树节活动总结
2014/03/10 职场文书
党员应该树立反腐倡廉的坚定意识思想汇报
2014/09/12 职场文书
2015年学校德育工作总结
2015/04/22 职场文书