匿名函数只在PHP 5.3.0 及以上版本有效
PHP闭包的特性并没有太大惊喜,其实用 CLASS就可以实现类似甚至强大得多的功能,更不能和js的闭包相提并论,只能期待PHP以后对闭包支持的改进。不过匿名函数还是挺有用的,比如在使用 array_filter()等之类的函数可以不用在外部声明回调函数了。
目前还不稳定,不适用于正式开发。 so以下文字全部出自课件……
匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)的参数。 当然,也有其他应用的情况。
$func = function() {
//~~~
}; //带结束符
可以看到,匿名函数因为没有名字 如果要使用它,需要将其返回给一个变量。
匿名函数也像普通函数一样可以声明参数,调用方法也相同:
$func = function( $param ) { echo $param; };//js匿名函数后面这里不加分号 $func( 'some string' ); //输出: //some string
举个栗子:
<?php function funname($a,$b,$c){ return $a+$b+$c; } $var ="funname"; var_dump($var);
string 'funname' (length=7)
用匿名函数呢
<?php $var=function($a,$b,$c){ return $a+$b+$c; } $aa=$var; echo $aa(1,2,3);
你是不是傻!!分号被你吃了???
<?php $var=function($a,$b,$c){ return $a+$b+$c; }; $aa=$var; echo $aa(1,2,3);
小栗子1:
function printStr() { $func = function( $str ) { echo $str; }; $func( 'some string' ); } //在函数中把匿名函数返回,并且调用它 printStr();连接闭包和外界变量的关键字:USE
小栗子2:
//在函数中把匿名函数返回,并且调用它 function getPrintStrFunc() { $func = function( $str ) { echo $str; }; return $func; } $printStrFunc = getPrintStrFunc(); $printStrFunc( 'some string' );小栗子3
//把匿名函数当做参数传递,并且调用它 function callFunc( $func ) { $func( 'some string' ); } $printStrFunc = function( $str ) { echo $str; }; callFunc( $printStrFunc ); //也可以直接将匿名函数进行传递。这种写法可能会很熟悉(js) callFunc( function( $str ) { echo $str; } );
unction getMoney() { $rmb = 1; $dollar = 6; $func = function() use ( $rmb ) { echo $rmb; echo $dollar; }; $func(); } getMoney(); //输出: //1 //报错,找不到dorllar变量可以看到,dollar没有在use关键字中声明,在这个匿名函数里也就不能获取到它,所以开发中要注意这个问题。
是否可以在匿名函数中改变上下文的变量---- 否
function getMoney() { $rmb = 1; $func = function() use ( $rmb ) { echo $rmb; //把$rmb的值加1 $rmb++; }; $func(); echo $rmb; } getMoney(); //输出: //1 //1
但是我想要完全引用变量,而不是复制。要达到这种效果,其实在变量前加一个 & 符号就可以了:
function getMoney() { $rmb = 1; $func = function() use ( &$rmb ) { echo $rmb; //把$rmb的值加1 $rmb++; }; $func(); echo $rmb; } getMoney(); //输出: //1 //2如果将匿名函数返回给外界,匿名函数会保存use所引用的变量,而外界则不能得到这些变量,这样形成‘闭包'这个概念可能会更清晰一些。
function getMoneyFunc() { $rmb = 1; $func = function() use ( &$rmb ) { echo $rmb; //把$rmb的值加1 $rmb++; }; return $func; } $getMoney = getMoneyFunc(); $getMoney(); $getMoney(); $getMoney(); //输出: 1 2 3
闭包的应用场景
1、保护函数内的变量安全。以最开始的例子为例,外层函数中变量只有内部函数才能访问,而无法通过其他途径访问到,因此保护了外层函数中变量的安全性。
2、在内存中维持一个变量。依然如前例,由于闭包,外层函数中的变量一直存在于内存中,因此每次执行,都会使用到。
好了,今天搞php搞一天了,by the way 关键字不区分大小写