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 相关文章推荐
使用sockets:从新闻组中获取文章(一)
Oct 09 PHP
PHP 读取Postgresql中的数组
Apr 14 PHP
PHP 基于Yii框架中使用smarty模板的方法详解
Jun 13 PHP
php之Smarty模板使用方法示例详解
Jul 08 PHP
PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法
Jul 11 PHP
PHP函数实现分页含文本分页和数字分页
Oct 23 PHP
Yii核心组件AssetManager原理分析
Dec 02 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
May 19 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
Feb 27 PHP
Laravel5.4框架使用socialite实现github登录的方法
Mar 20 PHP
Yii框架getter与setter方法功能与用法分析
Oct 22 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
如何删除多级目录
2006/10/09 PHP
PHP之COOKIE支持详解
2010/09/20 PHP
学习php分页代码实例
2013/10/24 PHP
又十个超级有用的PHP代码片段
2015/09/24 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
2015/12/18 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
Jquery 绑定时间实现代码
2011/05/03 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
input输入框鼠标焦点提示信息
2015/03/17 Javascript
javascript表格的渲染组件
2015/07/03 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
JS设计模式之策略模式概念与用法分析
2018/02/05 Javascript
nodejs express配置自签名https服务器的方法
2018/05/22 NodeJs
Vue 实现从小到大的横向滑动效果详解
2019/10/16 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
微信小程序轮播图swiper代码详解
2020/12/01 Javascript
Python基于回溯法解决01背包问题实例
2017/12/06 Python
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
Python利用matplotlib做图中图及次坐标轴的实例
2019/07/08 Python
浅析Windows 嵌入python解释器的过程
2019/07/26 Python
在Python3 numpy中mean和average的区别详解
2019/08/24 Python
Python3+Selenium+Chrome实现自动填写WPS表单
2020/02/12 Python
pycharm中使用request和Pytest进行接口测试的方法
2020/07/31 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
美国精品地毯网站:Boutique Rugs
2020/03/04 全球购物
应聘编辑职位自荐信范文
2014/01/05 职场文书
《跨越百年的美丽》教学反思
2014/02/11 职场文书
高考标语大全
2014/06/05 职场文书
幼儿园健康教育方案
2014/06/14 职场文书
乡镇保密工作责任书
2014/07/28 职场文书
2014派出所所长群众路线对照检查材料思想汇报
2014/09/18 职场文书
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL