在segmentfault找到了一个答案,本来这是php5.3引入闭包的一种特别用法,use意义是毗连闭包和外界情况变量。
PHP闭包(Closure)function() use(){}的利用方式
匿名函数
当斟酌闭包时,必须斟酌匿名函数,也称为闭包,这似乎是 PHP 中实现闭包的首要方式。声明一个匿名函数以下:
layui-box layui-code-view" style="margin-top: 0px; margin-bottom: 5px; padding: 15px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); white-space: pre-wrap; overflow-wrap: break-word; box-sizing: inherit; position: relative; font-size: 15px; border: 1px solid rgb(209, 209, 209); background-color: rgb(255, 255, 255); color: rgb(68, 68, 68); font-family: inherit; outline: 0px; vertical-align: baseline; line-height: 28.5px; max-width: 100%; overflow: auto; word-break: break-all;">code
- $func = function() {
- }; //带竣事符
可以看到,匿名函数由于没著名字,假如要利用它,需要将其返回给一个变量。匿名函数也像普通函数一样可以声明参数,挪用方式也不异:
code
- $func = function( $param ) {
- echo $param;
- };
- $func( 'some string' );
- //输出:
- //some string
顺便提一下,PHP在引入闭包之前,也有一个可以建立匿名函数的函数:create function,可是代码逻辑只能写成字符串,这样看起来很艰涩而且欠好保护,所以很少有人用。
实现闭包
将匿名函数在普通函数中当做参数传入,也可以被返回。这就实现了一个简单的闭包。
下边有三个例子:
code
- //例一
- //在函数里界说一个匿名函数,而且挪用它
- function printStr() {
- $func = function( $str ) {
- echo $str;
- };
- $func( 'some string' );
- }
- printStr();
- //例二
- //在函数中把匿名函数返回,而且挪用它
- function getPrintStrFunc() {
- $func = function( $str ) {
- echo $str;
- };
- return $func;
- }
- $printStrFunc = getPrintStrFunc();
- $printStrFunc( 'some string' );
- //例三
- //把匿名函数当做参数传递,而且挪用它
- function callFunc( $func ) {
- $func( 'some string' );
- }
- $printStrFunc = function( $str ) {
- echo $str;
- };
- callFunc( $printStrFunc );
- //也可以间接将匿名函数停止传递。假如你领会js,这类写法能够会很熟悉
- callFunc( function( $str ) {
- echo $str;
- } );
毗连闭包和外界变量的关键字:USE
闭包可以保存地点代码块高低文的一些变量和值。PHP在默许情况下,匿名函数不能挪用地点代码块的高低文变量,而需要经过利用use关键字。
换一个例子看看:
code
- function getMoney() {
- $rmb = 1;
- $dollar = 6;
- $func = function() use ( $rmb ) {
- echo $rmb;
- echo $dollar;
- };
- $func();
- }
- getMoney();
- //输出:
- //1
- //报错,找不到dorllar变量
如您所见,dollar没有在use关键字中声明,而且没法在此匿名函数中获得,是以我们在开辟中应留意此题目。
有人能够想晓得能否可以在匿名函数中变动高低文变量,但我发现不能
code
- function getMoney() {
- $rmb = 1;
- $func = function() use ( $rmb ) {
- echo $rmb;
- //把$rmb的值加1
- $rmb++;
- };
- $func();
- echo $rmb;
- }
- getMoney();
- //输出:
- //1
- //1
啊,本来use所援用的也只不外是变量的一个副本而已。可是我想要完全援用变量,而不是复制。
要到达这类结果,实在在变量前加一个 & 标记便可以了:
code
- function getMoney() {
- $rmb = 1;
- $func = function() use ( &$rmb ) {
- echo $rmb;
- //把$rmb的值加1
- $rmb++;
- };
- $func();
- echo $rmb;
- }
- getMoney();
- //输出:
- //1
- //2
好,这样匿名函数便可以援用高低文的变量了。假如将匿名函数返回给外界,匿名函数会保存use所援用的变量,而外界则不能获得这些变量,这样构成‘闭包’这个概念能够会更清楚一些。
按照描写改变一下上面的例子:
code
- function getMoneyFunc() {
- $rmb = 1;
- $func = function() use ( &$rmb ) {
- echo $rmb;
- //把$rmb的值加1
- $rmb++;
- };
- return $func;
- }
- $getMoney = getMoneyFunc();
- $getMoney();
- $getMoney();
- $getMoney();
- //输出:
- //1
- //2
- //3
总结
PHP闭包的特征并不太使人惊奇。究竟上,利用CLASS可以实现类似的甚至更强大的功用,更不用说js闭包了。我们只能期待PHP在未来改良其闭包支持。但是,匿名函数很是有用。例如,当利用preg_replace_callback等函数时,不必在内部声明回调函数。