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 相关文章推荐
详细介绍:Apache+PHP+MySQL配置攻略
Sep 05 PHP
PHP 文件缓存的性能测试
Apr 25 PHP
查找mysql字段中固定字符串并替换的几个方法
Sep 23 PHP
有关phpmailer的详细介绍及使用方法
Jan 28 PHP
CodeIgniter基本配置详细介绍
Nov 12 PHP
PHP中Session引起的脚本阻塞问题解决办法
Apr 08 PHP
php计算整个目录大小的方法
Jun 01 PHP
PHP实现简单实用的分页类代码
Apr 08 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
Nov 09 PHP
thinkPHP实现的联动菜单功能详解
May 05 PHP
Ajax+Jpgraph实现的动态折线图功能示例
Feb 11 PHP
实现laravel 插入操作日志到数据库的方法
Oct 11 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
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
php中json_encode UTF-8中文乱码的更好解决方法
2014/09/28 PHP
thinkPHP线上自动加载异常与修复方法实例分析
2016/12/01 PHP
PHP获取当前执行php文件名的代码
2017/03/02 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
SUN的《AJAX与J2EE》全文译了
2007/02/23 Javascript
jQuery 获取URL参数的插件
2010/03/04 Javascript
js 获取Listbox选择的值的代码
2010/04/15 Javascript
关于flash遮盖div浮动层的解决方法
2010/07/17 Javascript
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
jquery 显示*天*时*分*秒实现时间计时器
2014/05/07 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
JavaScript生成指定范围的时间列表
2018/03/19 Javascript
微信小程序实现翻牌抽奖动画
2020/09/21 Javascript
Vue如何实现验证码输入交互
2020/12/07 Vue.js
vue 通过base64实现图片下载功能
2020/12/19 Vue.js
Python 初始化多维数组代码
2008/09/06 Python
python通过shutil实现快速文件复制的方法
2015/03/14 Python
python 简单的多线程链接实现代码
2016/08/28 Python
Python基础练习之用户登录实现代码分享
2017/11/08 Python
TensorFlow的权值更新方法
2018/06/14 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
Python实现通过解析域名获取ip地址的方法分析
2019/05/17 Python
Django中在xadmin中集成DjangoUeditor过程详解
2019/07/24 Python
Django实现WebSSH操作物理机或虚拟机的方法
2019/11/06 Python
python获取响应某个字段值的3种实现方法
2020/04/30 Python
如何表示python中的相对路径
2020/07/08 Python
支持IE8的纯css3开发的响应式设计动画菜单教程
2014/11/05 HTML / CSS
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
html5通过postMessage进行跨域通信的方法
2017/12/04 HTML / CSS
Hotels.com拉丁美洲:从豪华酒店到经济型酒店的预定优惠和折扣
2019/12/09 全球购物
牛津在线药房:Oxford Online Pharmacy
2020/11/16 全球购物
大四学生思想汇报
2014/01/13 职场文书
教师自我鉴定范文
2014/03/20 职场文书
读《工匠精神》有感:热爱工作,精益求精
2019/12/28 职场文书
安装pytorch时报sslerror错误的解决方案
2021/05/17 Python