---(迁移自本人2015-08-14 10:36:06 日的新浪博客日志)
以前写的一堆东西放在博客格式也不对,现在全部迁移过来。
php的闭包或许我从来没去注意过,php还有这个用法。互联网在不断的更新,我们也要跟上自己的脚步,虽然说对你写程序是不是帮助特别大,或者用得多不多,这些都不必要去考虑,至少它存在了,我们要知道就可以了,至于你用或者不用,在于你了。
自上回因空余时间看了看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++ 然后匿名函数会保存这些 ++之后的值,下次调用的时候,
就会使用保存的这些值来输出,而匿名函数外面却得不到这些值,这就是闭包的概念了。
现在终于可以理解了吧!
标签:闭包,closure,函数,function,printstr,echo,匿名,php
来源: https://www.cnblogs.com/willahuang/p/13363094.html