php 5.3+新特性闭包的使用

所谓闭包,即内部函数使用了在外部定义的变量

先来看下一个简单的例子,以便有个初步认识:

<?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和闭包,所以闭包之前是独立的。

 

原文地址:https://www.cnblogs.com/fanglin/p/2511997.html