php 闭包(closure)的使用
---(迁移自本人2015-08-14 10:36:06 日的新浪博客日志)
以前写的一堆东西放在博客格式也不对,现在全部迁移过来。
--------------------------------------------------------------------------------------------------------------
自上回因空余时间看了看python语言(),其中讲到了闭包的概念,python定义万物归一,一切皆对象的概念。
那么函数也是一个对象,所以可以作为某个函数的返回结果。想想这个闭包也是那么回事呀,
突然想想那php有没有闭包呢,后来一查找还真的有。编程的概念都是统一的,这就是计算机语言之间的想通之处呀!
那么php的闭包是怎么一回事呢?
php的闭包(closure)也就是匿名函数,php5.3引入的。说起匿名函数,好像还是比较耳熟的,这就来了兴趣了。
php匿名函数的语法很简单,
$a = function(){ }; //带结束符号
看到以上代码,你应该就能理解为何叫匿名函数了吧,声明一个没有名字的函数。如果想使用它,需要将其返回给一个$a变量。
匿名函数也可以像普通函数一样,声明参数, 调用方法也相同:
$a = function($param){ echo $param; }; $a('some string');
输出:
some string
在引入闭包之前,貌似这样的使用方法并不是很好用,所以用的人也比较少。那么怎么实现闭包呢?
闭包就是:将匿名函数在普通函数当中当做参数传入,也可以被返回,这样就形成了一个简单的闭包
//在函数里定义一个匿名函数并且调用它 function printstr(){ $a = function( $str){ echo $str; }; $a( 'some string' ); } printstr();
也可以这样使用:
//在函数里返回一个匿名函数,并且调用它 function printstr( ){ $a = function( $str ){ echo $str; } return $a; } $b = printstr(); $b( 'some string' );
闭包还可以使用外界变量,连接外界变量的关键字: use
function printstr(){ $c = 5; $a = function ( $str ) use ( $c){ $b = $a + $c; echo $b; $c ++; } $a(4); echo $c; } printstr();
输出:
9 4
我们可以看到使用use的$c 是可以 在匿名函数中使用用的,但是 $c的值并没有因为在匿名函数中 $c ++ 而改变,
其实匿名函数中只是使用了$c的一个副本而已,如果想完全引用$c 呢?只需要加一个 & 符号即可
function printstr(){ $c = 5; $a = function ( $str ) use (& $c){ $b = $a + $c; echo $b; $c ++; } $a(4); echo $c; } printstr();
输出:
9 5
这样匿名函数就可以改变外界的变量了,如果将匿名函数返回给外界,匿名函数会保存use 所引用的变量,而外界则不能得到这些变量,这样就形成为在你面函数里面的 ‘闭包’概念了,这样闭包的概念就清晰可见了。
function printstr(){ $c = 5; $a = function ( ) use (& $c){ echo $c; $c ++; } return $a; } $getParam = printstr(); $getParam( ); $getParam( ); $getParam( );
输出:
5 6 7
可以看到外界的$c 的值还是5,但是在匿名函数里面都每次$c++ 然后匿名函数会保存这些 ++之后的值,下次调用的时候,
就会使用保存的这些值来输出,而匿名函数外面却得不到这些值,这就是闭包的概念了。
现在终于可以理解了吧!

浙公网安备 33010602011771号