所谓闭包,即内部函数使用了在外部定义的变量
先来看下一个简单的例子,以便有个初步认识:
<?php $msg = "Hello!"; $fun = function () use ($msg) { //传值 echo $msg."\n"; }; $msg = "world!"; $fun();
[fl@linux1 ~]$ php test.php
Hello!
<?php $msg = "Hello!"; $fun = function () use (&$msg) { //传引用 echo $msg."\n"; }; $msg = "world!"; $fun();
fl@linux1 ~]$ php test.php
world!
从例子中可以看出:
a. 以传值方式传递的形参,闭包use的值在在闭包创建前就已经确定了。
b.以引用方式传值,实际上传的是地址,$msg这个地址上的值作了改变后,闭包内输出这个值自然就改变了
再来看一个使用闭包,生成相互独立的计数器的例子:
<?php function counter() { $counter = 1; return function() use(&$counter) {return $counter++;}; } $counter1 = counter(); $counter2 = counter(); echo $counter1()."\n"; echo $counter1()."\n"; echo $counter1()."\n"; echo $counter2()."\n"; echo $counter2()."\n"; echo $counter2()."\n";
分析:一般情况下调用counter()函数时,会创建局部变量$counter,函数返回时销毁局部变量。但在使用闭包后,闭包持有对$counter变量的引用,所以不会被回收。
另外,由于每次调用counter()都会生成独立的counter和闭包,所以闭包之前是独立的。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步