麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > 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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: av之家在线观看 | 免费看污视频在线观看 | 亚洲免费在线看 | 黄色免费不卡视频 | 国产高潮好爽好大受不了了 | 久草视频福利在线观看 | 久久最新网址 | 欧美成人黄色片 | 成人444kkkk在线观看 | 国产精品一区网站 | 国产片91 | 免费a视频在线观看 | 久久sp| 黄色18网站 | 草草影院地址 | 操碰97 | 一区二区三区小视频 | 日韩av官网| 中午日产幕无线码1区 | 免费观看一区二区三区视频 | 欧美精品免费一区二区三区 | 日韩视频一区二区三区在线观看 | av观看网站 | 99影视电影电视剧在线播放 | 被啪羞羞视频在线观看 | 九色中文字幕 | 亚洲天堂岛国片 | 九九热在线视频观看 | 吾色视频 | 激情久久一区二区 | 欧美在线观看视频一区 | 成人国产精品久久 | 国产一区二区三区四区在线 | 国产中出在线观看 | 99seav| 欧美日韩中文字幕在线视频 | 久久久一区二区三区精品 | 国产精品久久久久久久久久 | 国产正在播放 | 久久草在线视频 | 久久精品黄 |