真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PHP+Swoole的閉包怎么寫

這篇文章給大家分享的是有關(guān)PHP+Swoole的閉包怎么寫的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

網(wǎng)站建設哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、小程序定制開發(fā)、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了北流免費建站歡迎大家使用!

JS程序員總是嘲笑PHP沒有閉包,今天抽空寫一篇文章來專門介紹一下PHP的閉包。從5.3版本開始PHP就增加了匿名函數(shù)支持,經(jīng)過數(shù)個版本迭代到現(xiàn)在的PHP5.6、PHP7,PHP語言的閉包已經(jīng)非常完善了。再結(jié)合Swoole提供的事件驅(qū)動支持,PHP的閉包功能非常強大而且很優(yōu)雅。

匿名函數(shù)


匿名函數(shù)是閉包的核心,匿名函數(shù)在PHP里實際上是一個Closure類的對象(請注意是對象)。與普通的面向?qū)ο缶幊谭绞讲煌?,匿名函?shù)的代碼是直接寫在調(diào)用處的,不需要額外寫一個類,編寫方法的代碼。這樣的好處就是更直接。下面的示例是設置一個定時器,每2秒輸出hello world。

傳統(tǒng)寫法

function timer () {
    echo "hello world";
}
Swoole\Timer::tick(2000, 'timer');

閉包寫法

Swoole\Timer::tick(2000, function () {
    echo "hello world";
});

非閉包的傳統(tǒng)寫法,先要聲明一個函數(shù),再轉(zhuǎn)入函數(shù)名稱字符串。兩段代碼是分離的,不夠直觀。而閉包的寫法把定時器的聲明和定時器要執(zhí)行的代碼寫在了一起,邏輯非常清晰直觀。使用閉包語法可以很方便編寫回調(diào)函數(shù)。在事件驅(qū)動編程、排序、array_walk等需要用戶傳入一段執(zhí)行代碼的場景中,閉包的寫法非常優(yōu)雅。

閉包更強大的地方在于它可以直接在調(diào)用處引入外部變量。PHP中實現(xiàn)的方法就是use關(guān)鍵詞。

Use語法


如果剛才的定時器需要傳入一個變量,傳統(tǒng)的寫法只能通過全局變量來實現(xiàn)。與JS不同,PHP的變量引入是顯式的,如果要引用外部變量必須使用use來聲明。而JS是隱式的,匿名函數(shù)內(nèi)部可以隨意操作外部變量,無需聲明。這樣好處是少寫了一點代碼,缺點是存在風險和混亂。

傳統(tǒng)寫法

$str = "hello world";
function timer () {
    global $str;
    echo $str;
}
Swoole\Timer::tick(2000, 'timer');

閉包寫法

$str = "hello world";
Swoole\Timer::tick(2000, function () use ($str) {
    echo $str;
});

閉包寫法使用use直接引入了當前的$str變量,而不需要使用global全局變量。另外如果是在swoole的事件驅(qū)動編程模式,使用global就無法實現(xiàn)異步并發(fā)了,因為global全局變量只有1個,如果同時有多個客戶端請求,每個請求要查詢數(shù)據(jù)庫,輸出不同的內(nèi)容,傳統(tǒng)的編程方法就不太容易實現(xiàn),需要使用全局變量數(shù)組,以客戶端的ID為KEY保存各自的數(shù)據(jù)。

傳統(tǒng)寫法

$requestArray = array();
$dbResultArray = array();
function my_request($request, $response) {
    global $dbResultArray, $requestArray;
    $queryId = $db->query($sql, 'get_result');
    $requestArray[$request->fd] = array($request, $response);
    $dbResultArray[$queryId] = $request->fd;
}
function get_result($queryId, $queryResult) {
    global $dbResultArray, $requestArray;
    list($request, $response) = $requestArray[$dbResultArray[$queryId]];
    $response->end($queryResult);
}
$server->on('request', 'my_request');

閉包寫法

$server->on('request', function ($request, $response) {
    $queryId = $db->query($sql, function ($queryId, $queryResult) use ($request, $response) {
        $response->end($queryResult);
    });
});

傳統(tǒng)的寫法非常復雜,需要反復多次從全局數(shù)組保存/提取數(shù)據(jù)。而閉包的寫法非常簡潔優(yōu)雅,只用了幾行代碼就實現(xiàn)了同樣的功能。閉包寫法非常適合用來編寫異步非阻塞回調(diào)模式的服務器程序。目前熱門的編程語言中只有PHP和JS具備這種能力。

閉包更多特性


在類的方法中使用匿名函數(shù),5.4以上的版本無需使用use引入$this,直接可以在匿名函數(shù)中使用$this來調(diào)用當前對象的方法。在swoole編程中,可以利用此特性減少$serv對象的use引入傳遞。

class Server extends Swoole\Server {
    function onReceive($serv, $fd, $reactorId, $data) {
        $db->query($sql, function ($queryId, $queryResult) use ($fd) {
            $this->send($fd, $queryResult);
        }
    }
}

另外如果希望在閉包函數(shù)中修改外部變量,可以在use時為變量增加&引用符號即可。注意對象類型不需要加&,因為在PHP中對象默認就是傳引用而非傳值。

感謝各位的閱讀!關(guān)于PHP+Swoole的閉包怎么寫就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!


本文名稱:PHP+Swoole的閉包怎么寫
當前URL:http://weahome.cn/article/ipsjhh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部