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 相关文章推荐
smarty的保留变量问题
Oct 23 PHP
PHP写杨辉三角实例代码
Jul 17 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
Apr 24 PHP
PHP针对常规模板引擎中与CSS/JSON冲突的解决方法
Aug 19 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
Jan 07 PHP
PHP实现JS中escape与unescape的方法
Jul 11 PHP
php基于curl实现随机ip地址抓取内容的方法
Oct 11 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
Dec 02 PHP
Ajax请求PHP后台接口返回信息的实例代码
Aug 21 PHP
Laravel框架自定义验证过程实例分析
Feb 01 PHP
ThinkPHP5.1验证码功能实现的示例代码
Jun 08 PHP
php实例化对象的实例方法
Nov 17 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
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
PHP新手上路(十三)
2006/10/09 PHP
ThinkPHP整合百度Ueditor图文教程
2014/10/21 PHP
php版交通银行网银支付接口开发入门教程
2016/09/26 PHP
浅谈PHP中的错误处理和异常处理
2017/02/04 PHP
PHP实现大数(浮点数)取余的方法
2017/02/18 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
基于jQuery实现的向下滑动二级菜单效果代码
2015/08/31 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
vue2.x 父组件监听子组件事件并传回信息的方法
2017/07/17 Javascript
webpack处理 css\less\sass 样式的方法
2017/08/21 Javascript
vue.js简单配置axios的方法详解
2017/12/13 Javascript
Vue+webpack+Element 兼容问题总结(小结)
2018/08/16 Javascript
vue实现百度下拉列表交互操作示例
2019/03/12 Javascript
javascript使用substring实现的展开与收缩文字功能示例
2019/06/17 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
vue点击自增和求和的实例代码
2019/11/06 Javascript
Vue之封装公用变量以及实现方式
2020/07/31 Javascript
python解析xml文件实例分析
2015/05/27 Python
Python中对象迭代与反迭代的技巧总结
2016/09/17 Python
Python sqlite3事务处理方法实例分析
2017/06/19 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
2019/09/20 Python
PHP高级工程师面试问题推荐
2013/01/18 面试题
秋季婚礼证婚词
2014/01/11 职场文书
物流专业大学的自我评价
2014/01/11 职场文书
2014年两会学习心得体会
2014/03/17 职场文书
本科毕业生自荐信
2014/06/02 职场文书
应急处置方案
2014/06/16 职场文书
2014年党总支工作总结
2014/12/18 职场文书
求职自我评价怎么写
2015/03/09 职场文书
长征观后感
2015/06/09 职场文书
2015年学校远程教育工作总结
2015/07/20 职场文书
使用Oracle跟踪文件的问题详解
2021/06/28 Oracle
MySQL学习之基础命令实操总结
2022/03/19 MySQL