博客專欄

        EEPW首頁 > 博客 > PHP中閉包和匿名函數分享

        PHP中閉包和匿名函數分享

        發布人:only1 時間:2020-09-29 來源:工程師 發布文章

        今天扣丁學堂給大家介紹的是關于PHP中的閉包和匿名函數,以及閉包的作用,希望對同學們學習有所幫助,下面我們一起來看一下吧。

          

        PHP支持回調函數(callback)和其他高級語言相比是增分比較多的一項功能。但是和JavaScript相比,php5.3以前的回調函數使用并不是很靈活的,只有字符串的函數名和使用create_function的返回值兩種選擇。而在php5.3以后,我們又多了一個選擇--匿名函數(Anonymousfunction),也叫閉包函數(closures),它允許臨時創建一個沒有指定名稱的函數,常用作回調函數參數的值。  

        閉包是指在創建時封裝周圍狀態的函數。即使閉包所在的環境不存在了,閉包中封裝的狀態依然存在。  

        匿名函數就是沒有名稱的函數。匿名函數可以賦值給變量,還能像其他任何PHP對象那樣傳遞。不過匿名函數仍是函數,因此可以調用,還可以傳入參數。匿名函數特別適合作為函數或方法的回調。  

        注意:理論上講,閉包和匿名函數是不同的概念。不過,PHP將其視作相同的概念。所以,我們提到閉包時,指的也是匿名函數,反之亦然。  

        PHP閉包和匿名函數使用的句法與普通函數相同,但閉包和匿名函數其實是偽裝成函數的對象(Closure類的實例)。  

        //創建閉包  

        $closure=function($name){  

        returnsprintf("Hello%s",$name);  

        }  

        echo$closure("jerry");  

        //檢測$closure變量是否是一個閉包  

        var_dump($closureinstanceofClosure);  

        以上代碼創建了一個閉包對象,然后將其賦值給$closure變量。閉包和普通的PHP函數很像,使用的句法相同,也接收參數,而且能返回值。  

        說明:我們之所以能夠調用$closure變量,是因為這個變量的值是一個閉包,而且閉包對象實現了__invoke()魔術方法。只要變量名后有(),PHP就會查找并調用__invoke()方法。  

        使用閉包我們通常把PHP閉包當做當做函數和方法的回調使用。很多PHP函數都會用到回調函數,例如array_map()和preg_replace_callback().如下示例,我們將用array_map()處理數組,將數組每一項自增1:  

        $nubmers=array_map(function($number){  

        return$number++;  

        },[1,2,3]);  

        var_dump($numbers);  

        附加狀態PHP閉包不會像真正的javascrypt閉包那樣自動封裝應用的狀態,我們必須手動調用閉包對象的bindTo()方法或者使用use關鍵字,把狀態附加到PHP閉包上。  

        使用use關鍵字  

        使用use關鍵字來附加閉包狀態更加常見,因此我們先來看這種方式。使用use關鍵字把變量附加閉包上時,附加的變量會記住附加時賦給它的值。  

        functionCar($name){  

        returnfunction($statu)use($name){  

        returnsprintf("Car%sis%s",$name,$statu);  

        }  

        }  

        //將車名封裝在閉包中  

        $car=Car("bmw");  

        //調用車的動作  

        //輸出-->"bmwisrunning"  

        echo$car("running");  

        注意:使用use關鍵字可以把多個參數傳入閉包,此時要像PHP函數或方法的參數一樣,使用逗號分隔多個參數。  

        使用bindTo()方法附加閉包的狀態  

        與其它PHP對象類似,每個閉包實例都可以使用$this關鍵字獲取閉包的內部狀態。閉包對象的默認狀態沒什么用,不過有一個__invoke()魔術方法和bindTo()方法。  

        bindTo()方法為閉包增加了一些有趣的潛力。我們可以使用這個方法把Closure對象的內部狀態綁定到其它對象上。  

        bindTo()方法的第二個參數很重要,其作用是指定綁定閉包的那個對象所屬的PHP類。因此,閉包可以訪問綁定閉包的對象中受保護和私有的成員變量。  

        classTestClosure  

        {  

        private$name=[];  

        private$age;  

        private$sex;  

        publicfunctionaddPerson($name,$personCallback){  

        //將閉包對象綁定當前實例  

        $this->name[$name]=$personCallback->bindTo($this,__CLASS__);  

        }  

        publicfunctiondisplay($name){  

        foreach($this->nameas$key=>$callback){  

        if($key==$name){  

        //執行閉包對象,將閉包狀態附加到類  

        $callback();  

        }  

        }  

        echo"name:{$name}\n";  

        echo"age:{$this->age}\n";  

        echo"sex:{$this->sex}\n";  

        }  

        }  

        $person=newTestClosure();  

        $person->addPerson("jerry",function(){  

        $this->age=19;  

        $this->sex="man";  

        });  

        $person->display("jerry");  

        /**output  

        name:jerry  

        age:19  

        sex:man  

        */  

        以上就是關于扣丁學堂PHP視頻教程之PHP中閉包和匿名函數的詳細介紹,最后想要了解更多關于PHP開發發展前景趨勢,請關注扣丁學堂官網、微信等平臺,扣丁學堂IT職業在線學習教育平臺為您提供權威的PHP培訓視頻教程系統,通過千鋒扣丁學堂金牌講師在線錄制的第一套自適應PHP在線視頻課程系統,讓你快速掌握PHP從入門到精通開發實戰技能。扣丁學堂PHP技術交流群:374332265。

        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞:

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 灵宝市| 敖汉旗| 历史| 栖霞市| 香格里拉县| 富源县| 通许县| 东乡族自治县| 巴东县| 当阳市| 茶陵县| 文登市| 柯坪县| 盐亭县| 永兴县| 海盐县| 古交市| 毕节市| 临颍县| 武清区| 大渡口区| 来凤县| 昌黎县| 灵山县| 兴城市| 天镇县| 天等县| 房产| 庐江县| 谢通门县| 句容市| 淅川县| 宜宾市| 鹿泉市| 沈阳市| 兰西县| 新余市| 上杭县| 万年县| 宁国市| 巴彦县|