国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

php的閉包(Closure)匿名函數初探

2024-05-04 23:42:58
字體:
來源:轉載
供稿:網友
本文主要給大家介紹的是php5.3引入的PHP匿名函數,也就是閉包(Closure),以及閉包的作用,非常詳細,這里推薦給有需要的小伙伴們。
 

提到閉包就不得不想起匿名函數,也叫閉包函數(closures),貌似PHP閉包實現主要就是靠它。聲明一個匿名函數是這樣:

$func = function() {   }; //帶結束符可以看到,匿名函數因為沒有名字,如果要使用它,需要將其返回給一個變量。匿名函數也像普通函數一樣可以聲明參數,調用方法也相同:$func = function( $param ) {  echo $param;}; $func( 'some string' ); //輸出://some string

順便提一下,PHP在引入閉包之前,也有一個可以創建匿名函數的函數:create function,但是代碼邏輯只能寫成字符串,這樣看起來很晦澀并且不好維護,所以很少有人用。

 1、實現閉包
將匿名函數在普通函數中當做參數傳入,也可以被返回。這就實現了一個簡單的閉包。

下邊有三個例子

//例一//在函數里定義一個匿名函數,并且調用它function printStr() {  $func = function( $str ) {    echo $str;  };  $func( 'some string' );} printStr();   //例二//在函數中把匿名函數返回,并且調用它function getPrintStrFunc() {  $func = function( $str ) {    echo $str;  };  return $func;} $printStrFunc = getPrintStrFunc();$printStrFunc( 'some string' );    //例三//把匿名函數當做參數傳遞,并且調用它function callFunc( $func ) {  $func( 'some string' );} $printStrFunc = function( $str ) {  echo $str;};callFunc( $printStrFunc ); //也可以直接將匿名函數進行傳遞。如果你了解js,這種寫法可能會很熟悉callFunc( function( $str ) {  echo $str;} );

2、連接閉包和外界變量的關鍵字:USE
閉包可以保存所在代碼塊上下文的一些變量和值。PHP在默認情況下,匿名函數不能調用所在代碼塊的上下文變量,而需要通過使用use關鍵字。

換一個例子看看:

function getMoney() {  $rmb = 1;  $dollar = 6;  $func = function() use ( $rmb ) {    echo $rmb;    echo $dollar;  };  $func();} getMoney(); //輸出://1//報錯,找不到dorllar變量

可以看到,dollar沒有在use關鍵字中聲明,在這個匿名函數里也就不能獲取到它,所以開發中要注意這個問題。

有人可能會想到,是否可以在匿名函數中改變上下文的變量,但我發現是不可以的:

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

啊,原來use所引用的也只不過是變量的一個副本而已。但是我想要完全引用變量,而不是復制。

要達到這種效果,其實在變量前加一個 & 符號就可以了:

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

好,這樣匿名函數就可以引用上下文的變量了。如果將匿名函數返回給外界,匿名函數會保存use所引用的變量,而外界則不能得到這些變量,這樣形成‘閉包'這個概念可能會更清晰一些。

根據描述改變一下上面的例子:

function getMoneyFunc() {  $rmb = 1;  $func = function() use ( &$rmb ) {    echo $rmb;    //把$rmb的值加1    $rmb++;  };  return $func;} $getMoney = getMoneyFunc();$getMoney();$getMoney();$getMoney(); //輸出://1//2//3

 總結
PHP閉包的特性并沒有太大驚喜,其實用CLASS就可以實現類似甚至強大得多的功能,更不能和js的閉包相提并論,只能期待PHP以后對閉包支持的改進。不過匿名函數還是挺有用的,比如在使用preg_replace_callback等之類的函數可以不用在外部聲明回調函數了。

小伙伴們是否對PHP的匿名函數也就是閉包函數有了新的認識了呢,希望本文能給大家一些提示,希望大家能夠喜歡。



注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 遂平县| 内丘县| 南阳市| 通城县| 康保县| 永城市| 新建县| 海南省| 化州市| 丰都县| 聂荣县| 松潘县| 贵州省| 韩城市| 乡宁县| 武安市| 沧州市| 乐都县| 常宁市| 涡阳县| 保亭| 黎平县| 湘阴县| 临洮县| 门源| 淮安市| 南投市| 元朗区| 岱山县| 华容县| 旌德县| 和顺县| 聊城市| 宝兴县| 柘城县| 新河县| 成安县| 盐城市| 弋阳县| 孝昌县| 和平县|