所谓闭包,即内部函数使用了在外部定义的变量
先来看下一个简单的例子,以便有个初步认识:
<?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和闭包,所以闭包之前是独立的。