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初学者头疼十四条问题大总结
Nov 12 PHP
php session安全问题分析
Jun 24 PHP
$_GET['goods_id']+0 的使用详解
Jun 06 PHP
php5.3 goto函数介绍和示例
Mar 21 PHP
php发送get、post请求的6种方法简明总结
Jul 08 PHP
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
Dec 24 PHP
laravel5.2实现区分前后台用户登录的方法
Jan 11 PHP
Yii2框架实现数据库常用操作总结
Feb 08 PHP
php实现保存周期为1天的购物车类
Jul 07 PHP
PHP实现时间比较和时间差计算的方法示例
Jul 24 PHP
PHP实现链式操作的三种方法详解
Nov 16 PHP
Laravel5.1 框架表单验证操作实例详解
Jan 07 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中的Class的几点个人看法
2006/10/09 PHP
ThinkPHP登录功能的实现方法
2014/08/20 PHP
PHP通过串口实现发送短信
2015/07/08 PHP
ASP中Sub和Function的区别说明
2020/08/30 Javascript
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
jQuery.extend 函数详解
2012/02/03 Javascript
jQuery 联动日历实现代码
2012/05/31 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
Jquery使用小技巧汇总
2015/12/29 Javascript
Node.js包管理器Yarn的入门介绍与安装
2016/10/17 Javascript
正则 js分转元带千分符号详解
2017/03/08 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
2017/08/17 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
2018/06/19 Javascript
JS中使用cavas截图网页并解决跨域及模糊问题
2018/11/13 Javascript
javascript实现图片轮播代码
2019/07/09 Javascript
python 字符串格式化代码
2013/03/17 Python
python不带重复的全排列代码
2013/08/13 Python
Python实现多行注释的另类方法
2014/08/22 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
Flask入门之上传文件到服务器的方法示例
2018/07/18 Python
python中的常量和变量代码详解
2018/07/25 Python
python抓取京东小米8手机配置信息
2018/11/13 Python
python flask框架实现重定向功能示例
2019/07/02 Python
Python循环结构的应用场景详解
2019/07/11 Python
Brora官网:英国领先的羊绒服装品牌
2019/08/28 全球购物
.NET里面什么时候需要调用垃圾回收
2015/06/01 面试题
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
广州足迹信息技术有限公司Java软件工程师试题
2014/02/15 面试题
自荐书范文
2013/12/08 职场文书
厂区绿化方案
2014/05/08 职场文书
文员试用期转正自我鉴定
2014/09/14 职场文书
党员国庆节演讲稿范文2014
2014/09/21 职场文书
纪律委员竞选稿
2015/11/19 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang
delete in子查询不走索引问题分析
2022/07/07 MySQL