当前位置: 首页 > 编程日记 > 正文

php的匿名函数和闭包函数

php的匿名函数和闭包函数

tags: 匿名函数 闭包函数 php闭包函数 php匿名函数 function use


引言:匿名函数和闭包函数都不是特别高深的知识,但是很多刚入门的朋友却总是很困惑,因为大家习惯上写了函数就是用来调用的,匿名函数和闭包函数做什么用的?

匿名函数

php官方解释如下:
匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。

这里说的很简单,可以用做回调函数,下面例子就是作为回调函数

<?php
echo preg_replace_callback('~-([a-z])~', function ($match) {return strtoupper($match[1]);
}, 'hello-world');
// 输出 helloWorld
?>

上述例子中,preg_replace_callback 函数需要三个参数,第一个参数是一个正则表达式用来匹配数据,第二个参数是一个函数,第三个参数是需要匹配的字符串,也可以像下面这样写

<?php
$testFunc = function ($match) {return strtoupper($match[1]);};echo preg_replace_callback('~-([a-z])~', $testFunc, 'hello-world');
// 输出 helloWorld
?>

但是我们看到这个方法显然我们只需要用一次,所以没有必要再给他去命名,也没有多大的必要再去把他赋值给一个变量(赋值给变量的过程:PHP 会自动把此种表达式转换成内置类 Closure 的对象实例赋值给变量)

闭包函数

php中匿名函数也叫闭包函数,所以没什么区别。但是一般意义上的闭包的概念不是这样的,我们先说一下传统意义上的闭包,并提供一篇文章中js中的闭包用来和php中的闭包(匿名函数)进行对比。
学习Javascript闭包(Closure)---阮一峰

php中其实没有传统意义上的闭包函数,因为php中的函数不能调用夫作用域中的变量。如下

<?phpfunction a(){$a = 11;function b(){$b = 22;echo $a;echo $b;}b();}a();
//报Notice:Undefined variable: a in index.php on line 6
//22
?>

而看上面文章中得知,js中是可以的。所以php中匿名函数也叫闭包函数,也可以传递父作用域的变量进闭包函数(达到了类似js获取父作用域变量的效果),php中使用的是use关键字,具体如下

<?php
$count = 0;$a = function()
{ var_dump($count); };$b = function() use ($count)
{ var_dump($count); };$count++;$c = function() use (&$count)
{ var_dump($count); };$count++;$a();    // null   Notice: Undefined variable: count in
$b();    // int 0
$c();    // int 2
$count++;
$b();    // int 0?>

上述例子的输出和你认为的是不是不同呢。

解析:闭包函数(匿名函数)使用use获取函数定义时的副作用域变量,不管在何时调用。如果要获取调用时的变量值,需要用引用传递。具体怎么使用就要看什么使用场景了。

列举了几种常用的场景

  1. 作为回调函数
//一个我们使用过的例子
<?php/** 菜谱拆分食物后的拼接* 参数均不能为空* */public function mergeFoodsStr($str,array $mapping){
//        $str = '白菜半棵、__2__鲍菇两只、__0__一根,__1__两根,三者比例为100:100:15,酱油5克,香油2克,盐1克。';
//        $mapping = array(
//            0 =>array('name' => '胡萝卜','id' =>  '81' ),
//            1 =>array ( 'name' => '萝卜', 'id' =>  '72'),
//            2 =>array ( 'name' =>  '杏', 'id' => '1841')
//        );if(empty($str) || empty($mapping)){return false;}$strNew = preg_replace_callback('"|__(\d)__|" ',function ($matches) use ($mapping){return $mapping[$matches[1]]['name'];},$str);$this->log('拼接后的食材字符串',$strNew);return $strNew;}
?>

2.如果是一次性使用的函数,不能被重用,可以使用闭包函数

  1. 使用array_work()函数配合匿名函数来减少foreach层数
  2. 等等
希望大家多评论交流,互相学习

相关文章:

青少年编程竞赛交流群周报(第042周)

2021年12月19日&#xff08;周日&#xff09;晚20:00我们在青少年编程竞赛交流群开展了第四十二期直播活动。 一、直播内容 我们直播活动的主要内容如下&#xff1a; 讲解了上次测试中小朋友们做错的题目 Scratch青少年编程能力等级测试模拟题&#xff08;四级&#xff09;。…

太原理工大学计算机专业多少分录取分数线,多少分能上山西太原理工大学,往年全国各省各专业录取分数线出炉...

太原理工大学简称“太原理工”&#xff0c;位于山西省太原市&#xff0c;国家”世界一流学科建设高校“&#xff0c;国家“211工程”重点建设高校&#xff0c;国家“111计划”地方高校新建基地&#xff0c;教育部首批“卓越工程师教育培养计划”实施高校如果报考太原理工大学&a…

CentOS 7磁盘格式化

查看CentOS 7支持的文件系统格式 [rootcentos-01 ~]# cat /etc/filesystems xfs ext4 ext3 ext2 nodev proc nodev devpts iso9660 vfat hfs hfsplus *mount查看分区的文件系统格式 [rootcentos-01 ~]# mount sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,secl…

Task04:青少年软件编程(Scratch)等级考试模拟卷(一级)

电子学会 软件编程&#xff08;图形化&#xff09;一级训练营 试题来源 青少年软件编程&#xff08;Scratch&#xff09;等级考试试卷&#xff08;一级&#xff09;【2019.09】青少年软件编程&#xff08;Scratch&#xff09;等级考试试卷&#xff08;一级&#xff09;【2019…

oracle 无效索引

错误信息&#xff1a;ORA-01502: index VOX_ID or partition of such index is in unusable state 原因&#xff1a;将表的表空间做了更改&#xff0c;导致索引失效。表移动表空间&#xff0c;需要重建索引。 解决方法&#xff1a;alter index vox_id rebuild 问题查找&#xf…

遂宁专业计算机学校,遂宁计算机专业中职学校哪家强

贵重人才计算机专业2013级学位3950***终一起交款&#xff0c;acccloud已售能力超级强&#xff0c;目前可选的学校有&#xff1a;北京农林科技大学云南省云南农业大学***蒙古族自治州科考学院长春师范大学南宁师范大学甘肃农业大学浙江交通大学南阳师范大学东南大学武汉商学院合…

整理收集49条JQuery代码小结

1. 如何创建嵌套的过滤器 . 代码如下://允许你减少集合中的匹配元素的过滤器&#xff0c; //只剩下那些与给定的选择器匹配的部分。在这种情况下&#xff0c; //查询删除了任何没&#xff08;:not&#xff09;有&#xff08;:has&#xff09; //包含class为“selected”&am…

接口跟抽象类的区别

接口跟抽象类的区别 1.抽象类有构造方法&#xff1b;接口不能有构造方法 2.抽象类中可以有普通成员变量&#xff1b;接口中只能有public static final修饰的全局变量&#xff08;可以默认不写&#xff09; 3.抽象类包含普通方法&#xff0c;静态方法&#xff1b;接口只能有抽象…

Task05:青少年软件编程(Scratch)等级考试模拟卷(一级)

电子学会 软件编程&#xff08;图形化&#xff09;一级训练营 试题来源 青少年软件编程&#xff08;Scratch&#xff09;等级考试试卷&#xff08;一级&#xff09;【2019.09】青少年软件编程&#xff08;Scratch&#xff09;等级考试试卷&#xff08;一级&#xff09;【2019…

国开计算机组成原理,国开计算机组成原理.docx

资料、答案联系喵小记作业网(微信QQ同号786971758)形考一一、单项选择题(每小题6分&#xff0c;共36分)题目1还未回答满分6.00标记题目题干下列数中最小的数是????????。选择一项&#xff1a;A. (1010011)2B. (42)8C. BCDD. (5A)16题目2还未回答满分6.00标记题目题干某…

参加第一届宇宙 JavaScript 大会是怎样的体验

大家好&#xff0c;我是奇舞团&#xff0c;大家可以叫我小舞。第一届全宇宙 JavaScript 开发者大会三天后就要举行了&#xff0c;作为举办方的我简直忙极了。好在场地已经选好了&#xff0c;由我司生产的不写代码只写BUG牌人工智能机器人们已经在帮我布置会场了。本次大会场地定…

使用Pixel Bender Toolkit制作特效——多像素采样(Part 4)

要求 用户级别 初级 必需产品 Flash Player 10Flash Professional CS4 (下载试用版)范例文件 pixel_bender_04.zip (5 KB)其他要求 Pixel Bender Toolkit Pixel Bender Toolkit 2.0 for Macintosh (DMG, 77 MB)Pixel Bender Toolkit 2.0 for Windows (ZIP, 48.8 MB)在本文中&am…

【组队学习】【32期】统计学习方法习题实战

统计学习方法习题实战 航路开辟者&#xff1a;胡锐锋、王维嘉、王瀚翀、王茸茸、毛鹏志领航员&#xff1a;张璇航海士&#xff1a;胡锐锋、王维嘉、王瀚翀、王茸茸、毛鹏志、王天富、范佳慧 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/statistical-le…

量子计算机 漫画,漫画 | 10分钟看懂量子比特、量子计算和量子算法

原标题&#xff1a;漫画 | 10分钟看懂量子比特、量子计算和量子算法请做好准备&#xff0c;即将进入烧脑模式&#xff01;宏观世界的生活经验很多都是表象。比如&#xff0c;你可能认为世界的运行是确定的、可预测的&#xff1b;一个物体不可能同时处于两个相互矛盾的状态。在微…

异步调用WCF的方法需要小心的地方

直接使用下面的代码&#xff0c;由于client对象占用的资源没有被释放&#xff0c;会导致内存泄露GetSimServiceReference.GetSimServiceClient client new GetSimServiceReference.GetSimServiceClient()client.computerSimAsync(DepartmentNo, FileID, F_intput.Length, Read…

中国电子学会青少年编程能力等级测试图形化四级编程题:打篮球

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100&#xff0c;小马老…

#读书笔记 Android-Activity启动模式

什么是Activity的启动模式&#xff1f;当启动一个Activity的时候&#xff0c;系统会创建一个实例&#xff0c;并把它放入到一个任务栈中&#xff0c;至于如何存放&#xff0c;就是由这个启动模式来决定的。Android系统支持多任务&#xff0c;所以系统中会同时存在多个任务&…

计算机专业PhD申请文书范文,美国留学博士申请文书怎么写之范文分享

【导语】对于计划申请美国博士学位的同学&#xff0c;美国博士申请文书的写作尤为重要。美国博士申请文书怎么写呢?本文无忧考网提供了一篇美国土木工程博士申请个人陈述范文&#xff0c;大家可以根据文章理清自己的写作思路。I am planning to pursue graduate studies towar…

ubuntu安装Android SDK,adb,fastboot

1,Eclips先安装&#xff1a;ADT&#xff1a; https://dl-ssl.google.com/android/eclipse/ 2,由于是64bit的系统&#xff0c;而Android sdk只有32bit的程序&#xff0c;需要安装ia32-libs&#xff0c;才能使用。 运行如下命令&#xff1a;sudo apt-get install ia32-libs 3,下载…

Eureka服务注册中心

Eureka服务注册中心 最近在研究Spring Cloud&#xff0c;发现其中的组件实在是太多了&#xff0c;真的是头大&#xff0c;只能一块一块看&#xff0c;像盲人摸象一样。要想很短时间内掌握Spring Cloud是不可能的&#xff0c;小编就学习一块就在这里分享一块&#xff0c;有什么不…

【组队学习】【32期】动手学数据分析

动手学数据分析 航路开辟者&#xff1a;陈安东、金娟娟、杨佳达、老表、李玲、张文涛、高立业领航员&#xff1a;范淑卷航海士&#xff1a;武者小路、曾心怡 基本信息 内容属性&#xff1a;精品入门课系列开源内容&#xff1a;https://github.com/datawhalechina/hands-on-d…

win8系统的计算机共享在哪里设置方法,怎么设置win8无线共享呢?

在windows8中怎么设置无线共享呢&#xff0c;接下来小编和大家一起来看看怎么设置windows8无线共享吧。1.以管理员模式运行CMD 输入命令行 netsh wlan show drive 如果支持会显示为是 。2.下面就搭建承载网络&#xff0c;输入 netsh wlan set hostednetwork mode allow ssid你想…

Android13.9.15

在创建android项目中&#xff0c;有一栏package name&#xff1a;——在Properties&#xff08;属性&#xff09;区域包名栏输入***.***。 &#xff08;包名至少应该包含两部分&#xff0c;中间用英文句点隔开&#xff09; 在main.xml文件中我们一定会看到下面这段代码 <?x…

【组队学习】【32期】李宏毅机器学习(含深度学习)

李宏毅机器学习&#xff08;含深度学习&#xff09; 航路开辟者&#xff1a;王茂霖、陈安东&#xff0c;刘峥嵘&#xff0c;李玲领航员&#xff1a;郭棉昇航海士&#xff1a;汪超、赵美 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/leeml-notes开源内容…

SVN提交错误:working copy is not up-to-date解决方法

我在项目中删了2个jar&#xff0c;然后SVN提交&#xff0c;一直提交不成功 svn在提交时报错如下图: working copy is not up-to-date svn:commit failed(details follow): svn:file "xxxxx is out of date" item is out of date svn:item "xxxx" is out of…

西部数码买哪处线路的云服务器,云服务器买哪个区合适

根据用户所在地区对于国内大陆的应用&#xff0c;选择国内地区的服务器速度肯定好于海外地区节点的速度。对于中国香港及海外其他国家节点来说&#xff0c;由于地理位置相差较远和路由等因素&#xff0c;不同节点会有较长的访问延迟&#xff0c;可以按照以下方式选择&#xff1…

从原则、方案、策略及难点阐述分库分表

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/79936693 一、分库分表原则 关系型数据库本身比较容易成为系统性能瓶颈&#xff0c;单机存储容量、连接数、处理能力等都很有限&#xff0c;数据…

.Net Framework中的委托与事件

using System; using System.Collections.Generic; using System.Text;namespace Delegate {// 热水器public class Heater {private int temperature;public string type "RealFire 001"; // 添加型号作为演示public string area "China Xian"; …

中国电子学会青少年编程能力等级测试图形化一级编程题:小鸡与鸭妈拥抱

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100&#xff0c;小马老…

坦克世界服务器未响应怎么解决,华硕笔记本老是程序未响应怎么处理

电脑型号 华硕 P45VJ 笔记本电脑操作系统 Windows 7 专业版 64位 ( DirectX 11 )处理器 英特尔 第三代酷睿 i7-3520M 2.90GHz 双核主板 华硕 P45VJ (英特尔 Ivy Bridge - HM76 Express 芯片组)内存8 GB ( 尔必达 DDR3 1600MHz )主硬盘 日立 HGST HTS541010A9E680 ( 1 TB / 540…