方林

再多的天才也无法胜过对细节的关注
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

php 5.3+新特性--闭包的使用

Posted on 2012-05-21 17:54  fl_dream  阅读(251)  评论(0编辑  收藏  举报

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

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

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