谈谈PHP闭包(Closure)的使用

电赛2024年H题智能小车基于MSPM0G3507主控MCU(利用8路灰度加上MPU6050的解决方式) 最后我觉得这个项目最重要的部分还是陀螺仪的精准度,如果一个陀螺仪的精准度高,这个项目就十分简单了,像mpu6050这种陀螺仪精准度就稍微差了一点,他有个最严重的问题就是温漂,偏航角会随着温度变化为变化,这一点在跑发挥项一的时候十分关键的,因为这个只差基督就会导致车子跑偏,导致无法完成 整个项目。如果条件足够的话建议可以换一个好一点的陀螺仪,然后就是灰度如果没有条件同样也可以换成红外。以上就是本次项目的一些小建议。 阅读详情

不知不觉发现PHP已经出到了5.5版本,而自己一直在用PHP5.2,让我看起来像深山出来的小伙子一样,又土又落后。在我习惯在javascript中使用闭包之后,忽然间对PHP的闭包打起了兴趣。

于是乎在网上下了个WAMP集成开发环境,是PHP5.3版本的(PHP5.3开始引入了闭包的特性),不得不说WAMP安装使用真的很方便。简单配置了一下,开始动手。
 

匿名函数
提到闭包就不得不想起匿名函数,也叫闭包函数(closures),貌似PHP闭包实现主要就是靠它。声明一个匿名函数是这样:

复制代码代码如下:


$func = function() {

}; //带结束符


可以看到,匿名函数因为没有名字,如果要使用它,需要将其返回给一个变量。匿名函数也像普通函数一样可以声明参数,调用方法也相同:

复制代码代码如下:


$func = function( $param ) {
    echo $param;
};


$func( 'some string' );

//输出:
//some string


顺便提一下,PHP在引入闭包之前,也有一个可以创建匿名函数的函数:create function,但是代码逻辑只能写成字符串,这样看起来很晦涩并且不好维护,所以很少有人用。
 


实现闭包
将匿名函数在普通函数中当做参数传入,也可以被返回。这就实现了一个简单的闭包。

下边有三个例子

复制代码代码如下:


//例一
//在函数里定义一个匿名函数,并且调用它
function printStr() {
    $func = function( $str ) {
        echo $str;
    };
    $func( 'some string' );
}


printStr();

 

//例二
//在函数中把匿名函数返回,并且调用它
function getPrintStrFunc() {
    $func = function( $str ) {
        echo $str;
    };
    return $func;
}

$printStrFunc = getPrintStrFunc();
$printStrFunc( 'some string' );

 


//例三
//把匿名函数当做参数传递,并且调用它
function callFunc( $func ) {
    $func( 'some string' );
}

$printStrFunc = function( $str ) {
    echo $str;
};
callFunc( $printStrFunc );

//也可以直接将匿名函数进行传递。如果你了解js,这种写法可能会很熟悉
callFunc( function( $str ) {
    echo $str;
} );


连接闭包和外界变量的关键字:USE
闭包可以保存所在代码块上下文的一些变量和值。PHP在默认情况下,匿名函数不能调用所在代码块的上下文变量,而需要通过使用use关键字。


换一个例子看看:

复制代码代码如下:


function getMoney() {
    $rmb = 1;
    $dollar = 6;
    $func = function() use ( $rmb ) {
        echo $rmb;
        echo $dollar;
    };
    $func();
}


getMoney();

//输出:
//1
//报错,找不到dorllar变量


可以看到,dollar没有在use关键字中声明,在这个匿名函数里也就不能获取到它,所以开发中要注意这个问题。
 


有人可能会想到,是否可以在匿名函数中改变上下文的变量,但我发现是不可以的:

复制代码代码如下:


function getMoney() {
    $rmb = 1;
    $func = function() use ( $rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    $func();
    echo $rmb;
}


getMoney();

//输出:
//1
//1


啊,原来use所引用的也只不过是变量的一个副本而已。但是我想要完全引用变量,而不是复制。


要达到这种效果,其实在变量前加一个 & 符号就可以了:

复制代码代码如下:


function getMoney() {
    $rmb = 1;
    $func = function() use ( &$rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    $func();
    echo $rmb;
}


getMoney();

//输出:
//1
//2


好,这样匿名函数就可以引用上下文的变量了。如果将匿名函数返回给外界,匿名函数会保存use所引用的变量,而外界则不能得到这些变量,这样形成‘闭包'这个概念可能会更清晰一些。


根据描述改变一下上面的例子:

复制代码代码如下:


function getMoneyFunc() {
    $rmb = 1;
    $func = function() use ( &$rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    return $func;
}


$getMoney = getMoneyFunc();
$getMoney();
$getMoney();
$getMoney();

//输出:
//1
//2
//3


总结
PHP闭包的特性并没有太大惊喜,其实用CLASS就可以实现类似甚至强大得多的功能,更不能和js的闭包相提并论,只能期待PHP以后对闭包支持的改进。不过匿名函数还是挺有用的,比如在使用preg_replace_callback等之类的函数可以不用在外部声明回调函数了。

YOLOv12改进策略【卷积层】| SPD-Conv 针对小目标和低分辨率图像的检测任务 SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。 阅读详情

相关推荐

C#实战:如何用Bartender 10.1实现动态打印与批量打印(附完整源码)

本文深入探讨了如何在C#项目中高效集成Bartender 10.1,实现企业级的动态打印与批量打印功能。文章提供了从环境配置、COM接口精讲、高可用打印服务类封装,到批量打印性能优化及生产环境部署的全套实战方案与源码,帮助开发者构建健壮、可维护的打印解决方案。

weixin_29290963的博客 435

PHP的闭包函数

本篇主要谈谈PHP中闭包函数。 闭包函数(Closures)又叫做匿名函数(Anonymous functions),也就是没有定义名字的函数。主要用作回调函数的参数值。闭包在 PHP5.3 中被引入。闭包使用的语法和普通函数相同,但是他其实是伪装成函数的对象,是 Closure 类的实例。闭包和字符串或整数一样,是等值类型。 1.创建闭包 1)没有参数的闭包 $closure = functi...

weixin_37705518的博客 1656

App渗透 - 人脸识别登录绕过

一、APP抓包和逆向破解加密算法打开APP是一个登录框抓包后发现参数被加密了使用Jadx脱源码发现,并没有加壳也没有混淆,运气很好根据经验,先搜索Encrypt、Decrypt等关键字,发现在Common.js中有一个encryptData函数定位过去,一套加解密算法都写好了放在这放到浏览器console里面调试,果然没错二、寻找注入点首先测试了一下注入明文:{"userName":"TEST'...

渗透测试研究中心 2823

PHP闭包(Closure)初探

不知不觉发现PHP已经出到了5.5版本,而自己一直在用PHP5.2,让我看起来像深山出来的小伙子一样,又土又落后。在我习惯在javascript中使用闭包之后,忽然间对PHP的闭包打起了兴趣。 于是乎在网上下了个WAMP集成开发环境,是PHP5.3版本的(PHP5.3开始引入了闭包的特性),不得不说WAMP安装使用真的很方便。简单配置了一下,开始动手。 匿名函数 提到闭包就不得不想起匿...

weixin_30940783的博客 262

手把手教你在VirtualBox里复活Win98,并搞定驱动和文件传输(含资源寻找攻略)

本文详细指导如何在VirtualBox中安装和配置Windows 98,包括驱动安装、文件传输等实用技巧。通过逐步教程和资源寻找攻略,帮助技术爱好者完美复刻这一经典操作系统,满足怀旧或兼容性测试需求。

weixin_29596051的博客 325

VMware Workstation Pro 25H2 去虚拟化精简便携版完全指南

虚拟机技术在现代开发和测试环境中扮演着重要角色,但客户机系统常因暴露虚拟化特征而被特定软件识别为“虚拟机”,导致功能受限。同时,官方 VMware Workstation Pro 安装包体积大、安装流程繁琐,难以实现移动化部署。去虚拟化通过修改 VMX 配置、屏蔽 CPUID 特征、反射宿主机硬件信息等手段降低被检测概率;精简与便携则通过裁剪非核心文件和改用脚本注册服务,实现即解压即用的轻量化形态。这类改版方案特别适合临时环境搭建、敏感软件兼容测试以及构建随身开发环境。本文从虚拟化检测原理出发,系统梳理了

weixin_34068198的博客 378

PHP闭包函数详细讲解

闭包是一种特殊的函数,可以在函数内部创建一个独立的作用域,以保护变量不受外部环境的影响。在PHP中,闭包使用匿名函数实现,并且可以作为函数参数或返回值使用。

php-yyds 764

【AI智能体】图像处理-生成营销 Banner 图

生成营销 Banner 图是一款用于制作营销图片的智能体,它可以根据指定的营销活动内容,快速生成活动 Banner 图片,降低活动运营成本、提高制图效率。

AI创变工坊,和1000万新个体创业者一起成长!愿大家都能跟上时代的洪流,不被社会淘汰,愿大家的生活工作收入都能具备竞争力! 1175

什么是PHP的闭包(Closure)和匿名函数?

在PHP中,闭包(Closure)和匿名函数(Anonymous Function)是密切相关的概念,两者均用于创建无需命名的函数单元。尽管PHP闭包功能强大,但其实现相比JavaScript更为严格,需注意性能影响。这一特性在框架(如Laravel)中广泛用于动态扩展对象功能。闭包可创建独立的作用域,保存变量状态。闭包允许在函数执行完毕后仍保留对外部变量的引用。这种方式避免了单独定义命名函数的冗余。匿名函数是没有指定名称的函数,通过。,形成对上下文的“封闭”。闭包是匿名函数的一种扩展形式,

破损的天堂鸟博客 700

基于 transformer、lstm、LSTM多特征的交通流量预测 完整数据代码 超全项目 本科硕士毕设卓卓有余

基于 transformer、lstm、LSTM多特征的交通流量预测 完整数据代码 超全项目 本科硕士毕设卓卓有余

4655

OpenClaw 超级 AI 实战专栏【实战案例】(五)邮件收发 + 日历日程 + 文件管理一站式搞定

OpenClaw 实现办公自动化核心是模块解耦:邮件收发、文件管理、日历日程各自封装,便于维护和扩展;开发中需重点解决编码兼容、权限配置、时间格式、重复处理四大类坑点,核心思路是 “提前校验 + 异常兜底 + 统一格式”;敏感信息(邮箱密码、API Token)务必通过.env管理,避免硬编码泄露。

qq_36130719的博客 742

php 闭包

php 闭包详细分析

afterlife_union的博客 2337

046篇:数据统计:分组、求和、平均值、最大最小值

本文介绍了在RPA中实现数据分组统计的方法。通过字典+循环组合,可以完成按单字段或多字段的分组聚合操作,包括求和、计数、求平均值及最大/最小值等。文章详细讲解了分组统计的原理,并提供了单级分组、多级分组的具体实现步骤,最后通过销售数据按月分组的实战案例,演示了如何从原始数据到生成汇总报表的完整流程。这些方法可以灵活应用于各类数据统计分析场景。

weixin_59649563的博客 214

谈谈对php的理解,谈谈我所理解的闭包,js和php里的closure

本人开始接触编程是从js开始的,当时网上很多人说闭包是难点,各种地方对闭包的解释也是千奇百怪。如今开始接触js以外的各种编程语言,发现不光是js,php、java、c等各种编程语言里都有闭包,而且大体意思是差不多的。js里的闭包比较权威的高程里是这样解释闭包的:闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。当初看这个解释有点懵逼,理解成闭包就...

weixin_27058835的博客 128

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

谈谈我所理解的闭包,js、php、golang里的closure

本人开始接触编程是从js开始的,当时网上很多人说闭包是难点,各种地方对闭包的解释也是千奇百怪。如今开始接触js以外的各种编程语言,发现不光是js,php、java、c++等各种编程语言里都有闭包,而且大体意思是差不多的。 js里的闭包 比较权威的高程里是这样解释闭包的: 闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,...

weixin_34088583的博客 214

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

PHP中的Closure闭包

Closure1.什么是Closure在PHP 4最早称为callback,PHP5.3引入了closure与anonymous function。为了避免由于PHP的若类型本质,让我们误以为传入的是一般类型参数,5.4中特别为传入的callback加上callable的类型限定;所以在PHP中,callback与closure、anonymous function与callable,事实上是同一个

LC900730的博客 1561

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

PHP 闭包函数及Closure对象的总结

疑问如果你在理解闭包函数的时候觉得比较费解,不如放一放,问自己一个问题: 面向对象编程语言对代码的复用主要采用继承来实现,那面向函数的代码复用能力通过什么来实现呢?你可能第一时间想到的是 函数嵌套,就是通过独立子函数来组织代码。那类似PHP里面的array_walk()、array_udiff()这些函数怎么实现呢?是不是觉得,有了匿名函数,array_walk()、array_udiff()这两

zoujunjie202的博客 5915

PHP 闭包(Closure)【转载】

大佬地址:https://learnku.com/articles/4625/php-closure-closure 一、闭包基本用法 闭包(Closure)又叫做匿名函数,也就是没有定义名字的函数。比如下面的例子: // 定义一个闭包,并把它赋给变量 $f $f = function () { return 7; } // 使用闭包也很简单 $f(); //这样就调用了闭包,输出 7 ...

qq_30923243的博客 332

PHP Closure(闭包)类详解

Closure 面向对象变成语言代码的复用主要采用继承来实现,而函数的复用,就是通过闭包来实现。这就是闭包的设计初衷。 注:PHP里面闭包函数是为了复用函数而设计的语言特性,如果在闭包函数里面访问指定域的变量,使用use关键字来实现。 PHP具有面向函数的编程特性,但是也是面向对象编程语言,PHP 会自动把闭包函数转换成内置类 Closure 的对象实例,依赖Closure 的...

weixin_30315905的博客 328

关于Php的闭包函数Closure(匿名函数)

再看如下定义的一个闭包函数完整示例代码的学生类,我们定义了一个学生类和一个获取性别的方法,然后在运行时候我们发现我们缺少一个获取名字的方法,这时我们当然可以去修改Student代码,但假设Student类很底层,我们尽量不去修改它的话,这时我们就可以使用Closure,将一个方法绑定到类(这里的业务和目的都是示意而已),我们将匿名方法:$getName = function(){return $this->name;如上,匿名函数很好理解,匿名函数的bind方法看以下代码理解起来也很容易。

本博客记录了从2014年以来在工作学习中遇到的技术问题、解决方法以及部分个人人生经历、经验等内容。 1228

php 判断是否闭包,php 闭包(closure)的使用

---(迁移自本人2015-08-1410:36:06 日的新浪博客日志)以前写的一堆东西放在博客格式也不对,现在全部迁移过来。php的闭包或许我从来没去注意过,php还有这个用法。互联网在不断的更新,我们也要跟上自己的脚步,虽然说对你写程序是不是帮助特别大,或者用得多不多,这些都不必要去考虑,至少它存在了,我们要知道就可以了,至于你用或者不用,在于你了。自上回因空余时间看了看python语言...

weixin_42099302的博客 666

PHP中闭包Closure::bind详解

最近在看laravel底层代码时 ,发现代码中很多Closure::bind用法,查询各种资料,一直对它的使用一直半解(网上大多都是抄袭教材,解释的不清楚),还好经过我不懈努力,终于弄懂了其中道理。 1、在正式解释前我们先了解一些基础的东西(稍安勿躁,磨刀不误砍柴工。大多说看不懂其用法的人,主要还是基础不牢)。php中 闭包我们也可以叫做匿名函数,匿名函数不了解的可以自行补一下,我这边简单举例...

好为人师 2433

php的instanceof和判断闭包Closure

instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例 <?php class MyClass { } class NotMyClass { } $a = new MyClass; var_dump($a instanceof MyClass); var_dump($a instanceof NotMyClass); ?> bool(true) ...

wuxing164的博客 1653

colsure php_PHP 闭包(Closure)

一、闭包基本用法闭包(Closure)又叫做匿名函数,也就是没有定义名字的函数。比如下面的例子:// 定义一个闭包,并把它赋给变量 $f$f = function () {return 7;}// 使用闭包也很简单$f(); //这样就调用了闭包,输出 7// 当然更多的时候是把闭包作为参数(回调函数)传递给函数function testClosure (Closure $callback) {r...

weixin_39541693的博客 131

php 闭包函数 instanceof Closure

PHP 闭包实现主要就是靠匿名函数 将匿名函数在普通函数中当做参数传入,也可以被返回,这就是实现了一个简单的闭包 通俗的说: 子函数可以使用父函数中的局部变量,这种行为就叫做闭包 闭包的两个特点 作为一个函数变量的一个引用。当函数返回时,其处于激活状态 一个闭包就是当一个函数返回时,一个没有释放资源的栈区 其实上面两个点可以合成一个点,就是闭包函数返回时,该函数内部变量处于激活状态,函数所在栈...

我只是个小学生 能力有限 一直抱着学习的态度 2042

深刻理解闭包,php中的closure使用详解

Closure英文在计算机术语中是闭包的意思。PHP手册中又解释Closure是用于代表匿名函数的类.。 匿名函数,顾名思义是没有名字的函数。其中,匿名函数也叫闭包函数。 闭包,在百度百科中的意思是能够读取其他函数内部变量的函数。 而在php中,别人会告诉你,闭包的功能是内部函数中可以使用外部变量。那么谁是对的呢? 那我们来了解一下。 <?php $closure = function(){...

晓风残月淡的博客 1653
上一篇: 让Json更懂中文(JSON_UNESCAPED_UNICODE)
下一篇: php中is_callable函数
Lankecms
博客等级 码龄15年 14粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值