• 
    
  • <tbody id="a8qsl"><track id="a8qsl"></track></tbody>
    <tbody id="a8qsl"><pre id="a8qsl"></pre></tbody>

      <dd id="a8qsl"><noscript id="a8qsl"></noscript></dd>
      您的位置 >>> 星想互联 >>> 编程技术 >>> PHP基础
      深刻理解闭包,php中的closure使用详解
      点击数:1412  发布时间2020-06-06 22:49:39
      Closure英文在计算机术语中是闭包的意思。PHP手册中又解释Closure是用于代表匿名函数的类.。
      匿名函数,顾名思义是没有名字的函数。其中,匿名函数也叫闭包函数。
      闭包,在百度百科中的意思是能够读取其他函数内部变量的函数。
      而在php中,别人会告诉你,闭包的功能是内部函数中可以使用外部变量。那么谁是对的呢?
      那我们来了解一下。

      $closure = function(){echo "hello";}; // 首先我们创建一个匿名函数
      var_dump($closure); // 输出object(Closure)#1 (0) { }

      $closure(); // 输出hello


      由此我们可以看出创建一个匿名函数,实际上是创建了一个Closure类的对象。
      所以closure其实是一个伪装成函数的对象。

      匿名函数很好理解,那么什么是闭包呢?

      首先,比如我们在下面模拟一个计数器功能,在php中我们想用一个函数去访问外部的变量。
      代码如下:

      //直接访问
      $count = 0;
      function add(){
      echo $count++;
      }
      add(); // error  无法调用$count,提示Undefined variable: count

      //接下来我们试着用匿名函数来实现
      $count = 0;
      $add = function(){
      echo $count++;
      };
      $add(); // error  依然无法调用$count,提示Undefined variable: count

      //通过关键字use来链接函数与外部变量
      $count = 0;
      $add = function() use($count){
      echo $count++;
      };
      $add(); // 0  可以访问$count了
      $add(); // 0  但$count依然是0,但我们想让数目增加。哦,原来$count只是一份副本,要$count保存原值进行操作要加上&

      //然后,我们在use括号里加上&
      $count = 0;
      $add = function() use(&$count){
      echo $count++;
      };
      $add(); // 0
      $add(); // 1  终于成功了!
      $add(); // 2 继续累加


      但是呢?上面的count是一个全局变量,任何外部方法都可以去改变它,为确保独立性。比如是一篇文章的浏览次数。
      我们将count放入一个函数中。以下:

      function add(){
      $count = 0;
      return function() use(&$count){echo $count++;};
      }
      $a=add();
      $a(); // 0
      $a(); // 1

      这也是成功的。我们理解了,闭包的实现的功能的确是内部函数中可以使用外部变量。

      那么,接下来我们,比较一下javascript代码与php代码的区别

      //javascript代码
      function a(){
      var i=0;
      function b(){
      alert(++i);
      }
      return b;
      }
      var c=a();
      c(); // 1
      c(); // 2

      对比上述两种语言的代码,实现了相同的功能。

      在JavaScript中,函数a的嵌套函数b由于作用域链的关系,能够读取它的外部变量i,嵌套函数是由名字的。
      而在php中,这必须通过use关键字来链接外部变量,并且函数本身是没名字的。
      当然对于外部来说,js代码的函数c的确是能够读取其他函数(a)的内部变量(i)的函数,当然它的本质是函数b。
      在上述php代码中,函数a也的确是能够读取其他函数(add)的内部变量($count)的函数,它的本质当然也是闭包函数。

      所以,虽然说法不同,但两者都实现了闭包,说的是同样的意思。

      接下来,我们创建一个参数完整的闭包函数,看看closure里面到底有什么。

      //首先创建了一个Apple类
      Class Apple{
      public static $name = "apple";
      public $color ="red";
      private $money = 10;
      public function getClosure(){
      $ex1 = self::$name;
      $ex2 = $this->money;
      return function($name) use($ex1,$ex2){
      echo $name."买了".$ex1."花了".$ex2;
      };
      }
      }
      $apple = new Apple();
      $c =$apple->getClosure();
      var_dump($c); //输出闭包。

      //输出格式如下
      object(Closure)#2 (3) {
      ["static"]=>
      array(2) {
      ["ex1"]=>
      string(5) "apple"
      ["ex2"]=>
      int(10)
      }
      ["this"]=>
      object(Apple)#1 (2) {
      ["color"]=>
      string(3) "red"
      ["money":"Apple":private]=>
      int(10)
      }
      ["parameter"]=>
      array(1) {
      ["$name"]=>
      string(10) "
      "
      }
      }

      从个上述的格式上来看,一个参数齐全的闭包自动添加了三个属性,分别是:static,this和parameter。
      闭包引用的外部变量参数自动给了static属性。
      同时,闭包所属的对象也就是apple对象自动给了一个this属性。
      闭包所需要输入的参数自动给了parameter属性,并且提示需要等待输入。

      我们看到在php中闭包的实现,用的都是没有名字的函数,所以匿名函数也叫闭包函数。
      ————————————————
      版权声明:本文为CSDN博主「晓风残月淡」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
      原文链接:https://blog.csdn.net/qq_40610003/java/article/details/99312506
      来源:咸宁网站建设
      日本高清中文字幕在线观穿线视频-一本色综合网久久-剧情国产AV剧情-欧美首页