1. 程式人生 > >閉包函式的特性和作用及應用場合

閉包函式的特性和作用及應用場合

<?php
/*1.匿名函式也叫閉包函式,顧名思義就是沒有名字的函式;
  2.因為沒有名字,所以匿名函式不能直接呼叫,需要先將匿名函式賦值給一個變數,然後由變數函式的形式來呼叫;
  3.匿名函式在函式體結束後必須在}後加上";",這也是它與普通函式的區別;
  4.匿名函式可以正常傳引數和參與計算;
*/


    $var=function($a,$b,$c)
    {
        return $a+$b+$c;
    };//加分號,切記
    var_dump($var);//輸出變數型別為一個物件,且隸屬於closure類中
    echo $var(1,2,3);//輸出6
    echo "<br>";
    
/*5.我們知道,函式不能直接使用外部定義的全域性變數,要想在函式中使用必須加上global關鍵字;
  6.閉包函式的概念通俗的講:就是在子函式中可以直接呼叫父函式中所定義的變數;
  7.要想讓子函式使用父函式中的變數必須使用關鍵字use來實現
*/

    function demo()//父函式demo
    {
        $a=10;
        $b=20;
        function one()//子函式one
        {
            global $a;
            echo "1111111111{$a}111111<br>";//無法直接輸出在父函式中定義的變數$a,如若宣告global,則會呼叫函式外部的全域性變數
        }
        function two()//子函式two
        {
            global $b;
            echo "222222222222222{$b}<br>";//無法輸出$b,在子函式中定義了global也不行

        }
        $three=function()use($a,$b)//子函式/匿名函式$three(),在匿名函式中使用use加父函式中的變數名就可以在子函式中輸出
        {
            echo "--$a--aaaaaa--$b--<br>";//可以正常輸出$a和$b
        };//切記加分號
        $three();
    }
    demo();
/*
    8.當內層函式呼叫外部函式的變數時,要加引用,否則不會改變區域性變數在函式中的值;
    9.閉包的外部是個函式,內部是一個匿名函式;
    10.閉包函式的作用就是保護閉包中的記憶體變數,閉包執行完畢後閉包內部的變數不會存在,而外部函式的變數則會儲存;
*/

    function test()
    {
        $a=10;
        $b=20;
        $inter=function()use(&$a,&$b)//加引用
        {
            echo $a,$b."<br>";
            $a++;
            $b++;
            echo $a,$b."<br>";
            //return,內層函式不能加返回值
        };
        return $inter;
    }
    $test=test();
    $test();
    $test();
    $test();//多次輸出後發現區域性變數的值並不會被釋放
//11.匿名函式可以當引數來使用
    function test1($func)
    {
        echo $func();
        echo "<br>";
    }
    test1(function(){
        return "$$$$$$$$";
    });//直接將一個匿名函式當做引數傳入函式中;
?>