PHP之闭包详解

匿名函数

提到闭包就不得不想起匿名函数,也叫闭包函数
如果要使用匿名函数,需要将其返回给一个变量
匿名函数也像普通函数一样也可以传递参数,调用方法也相同:

$func =function($param){
   echo '这就是一个简单的匿名函数'.$param;
};
$func('参数');

实现闭包

下面有几个列子,结果都是输出 “hello world”

列一:

在函数里定义一个匿名函数,并且调用它
function getPrintStrFunc(){
   $func = function ($str){
        echo 'function'.$str;
   };
   return $func;
};
$printStrFunc = getPrintStrFunc();
$printStrFunc('s.php');

例二:

把匿名函数当做参数传递,并且调用它
1.
function callFunc($func){
 $func();
};
$printStrFunc= function(){
   echo 'hello world';
};
callFunc($printStrFunc);
传进去相当于 $func() 调用闭包

2.

function callFunc($func){
    $func('hello world');
};
$printStrFunc= function($str){
    echo $str;
};
callFunc($printStrFunc);
传进去相当于 $func() 调用闭包 并带上参数

3.

也可以直接将匿名函数进行传递,如果你了解js,这种写法可能会很熟悉。
function callFunc($func){
    $func('hello world');
};
callFunc(function($str){
  echo $str;
});
hello world 就变成参数了

连接闭包和外界变量的关键字:USE

PHP在默认情况下,匿名函数不能调用所在代码块的上下文变量,而需要通过使用use关键字。

可以看到,dollar没有在use关键字中声明,在这个匿名函数里也就不能获取到它,所以开发中要注意这个问题。

有人可能会想到,是否可以在匿名函数中改变上下文的变量,但我发现是不可以的: $rmb++ 不起效果

例子:

function getMoney(){
   $rmb=1;
   $doller=6;
   $func=function() use ($rmb){
     echo $rmb;
     echo $rmb++;
     echo $doller;
   };
   $func();
};
getMoney();
//输出:1 1 但找不到dorllar变量

啊,原来use所引用的也只不过是变量的一个副本而已。但是我想要完全引用变量,而不是复制。 要达到这种效果,其实在变量前加一个 & 符号就可以了:

function getMoney(){
   $rmb=1;

   $func =function() use (&$rmb){
     echo $rmb;
     $rmb++; //把$rmb的值加1
   };
   $func();
   echo $rmb;
};
getMoney(); 
// 输出 1 2 

将匿名函数返回给外界,匿名函数会保存use所引用的变量值。

function getMoney(){
   $rmb =1 ;
   $func =function() use (&$rmb){
      echo $rmb;
      $rmb++;  //自增 1
   };
   return $func;
};

$func=getMoney();
$func();
$func();
$func();
//输出1 ,2 ,3 

本文由 admin 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论