zoukankan      html  css  js  c++  java
  • php 5.3+新特性闭包的使用

    所谓闭包,即内部函数使用了在外部定义的变量

    先来看下一个简单的例子,以便有个初步认识:

    <?php
    $msg = "Hello!";
    $fun = function () use ($msg) { //传值
         echo $msg."\n";
    };
    $msg = "world!";
    $fun();

    [fl@linux1 ~]$ php test.php
    Hello!

    <?php
    $msg = "Hello!";
    $fun = function () use (&$msg) { //传引用
         echo $msg."\n";
    };
    $msg = "world!";
    $fun();

    fl@linux1 ~]$ php test.php
    world!

    从例子中可以看出:

    a. 以传值方式传递的形参,闭包use的值在在闭包创建前就已经确定了。
    b.以引用方式传值,实际上传的是地址,$msg这个地址上的值作了改变后,闭包内输出这个值自然就改变了

    再来看一个使用闭包,生成相互独立的计数器的例子:

    <?php
    function counter() {
       $counter = 1;
       return function() use(&$counter) {return $counter++;};
    }
    
    
    $counter1 = counter();
    $counter2 = counter();
    
    echo $counter1()."\n";
    echo $counter1()."\n";
    echo $counter1()."\n";
    
    
    echo $counter2()."\n";
    echo $counter2()."\n";
    echo $counter2()."\n";

    分析:一般情况下调用counter()函数时,会创建局部变量$counter,函数返回时销毁局部变量。但在使用闭包后,闭包持有对$counter变量的引用,所以不会被回收。
            另外,由于每次调用counter()都会生成独立的counter和闭包,所以闭包之前是独立的。

     

  • 相关阅读:
    dp有哪些种类
    hibernate 双向n-n
    TextView——setCompoundDrawables说明
    Codeforces Round #FF (Div. 2)
    波折yosemite下载过程
    谁,例如下列方法区的指导下
    [LeetCode] 032. Longest Valid Parentheses (Hard) (C++)
    TCP/IP的经典网络编程
    NYOJ353 3D dungeon 【BFS】
    Ubuntu 14.04 grub2 温馨提示
  • 原文地址:https://www.cnblogs.com/fanglin/p/2511997.html
Copyright © 2011-2022 走看看