目錄
匿名函數
Use語法
閉包更多功能
首頁 後端開發 php教程 PHP+Swoole的閉包寫法

PHP+Swoole的閉包寫法

Oct 15, 2019 am 09:26 AM
swoole 閉包

JS程式設計師總是嘲笑PHP沒有閉包,今天就抽空寫一篇文章專門介紹PHP的閉包。從5.3版本開始PHP就增加了匿名函數支持,經過數個版本迭代到現在的PHP5.6、PHP7,PHP語言的閉包已經非常完善了。再結合Swoole提供的事件驅動支持,PHP的閉包功能非常強大而且很優雅。

匿名函數


        匿名函數是閉包的核心,匿名函數在PHP裡實際上是一個Closure類別的物件(請注意是物件) 。與普通的物件導向程式設計方式不同,匿名函數的程式碼是直接寫在呼叫處的,不需要額外寫一個類,編寫方法的程式碼。這樣的好處就是更直接。下面的範例是設定一個定時器,每2秒輸出hello world。

傳統寫法

function timer () {
    echo "hello world";
}
Swoole\Timer::tick(2000, 'timer');
登入後複製

閉包寫法

Swoole\Timer::tick(2000, function () {
    echo "hello world";
});
登入後複製

非閉包的傳統寫法,先聲明一個函數,再轉入函數名稱字串。兩段程式碼是分離的,不夠直覺。而閉包的寫法把定時器的聲明和定時器要執行的程式碼寫在了一起,邏輯非常清晰直觀。使用閉包語法可以很方便地編寫回呼函數。在事件驅動程式設計、排序、array_walk等需要使用者傳入一段執行程式碼的場景中,閉包的寫法非常優雅。

閉包更強大的地方在於它可以直接在呼叫處引入外部變數。 PHP中實作的方法就是use關鍵字。

Use語法


        如果剛才的定時器需要傳入一個變量,則傳統的寫法只能透過全域變數來實現。與JS不同,PHP的變數引入是明確的,如果要引用外部變數必須使用use來聲明。而JS是隱式的,匿名函數內部可以隨意操作外部變量,無需聲明。這樣好處是少寫了一點程式碼,缺點是存在風險和混亂。

傳統寫法

$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的事件驅動程式設計模式,使用global就無法實現異步並發了,因為global全域變數只有1個,如果同時有多個客戶端請求,每個請求要查詢資料庫,輸出不同的內容,傳統的程式設計方法就不太容易實現,需要使用全域變數數組,以客戶端的ID為KEY保存各自的資料。

傳統寫法

$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);
    });
});
登入後複製

傳統的寫法非常複雜,需要重複多次從全域數組保存/提取資料。而閉包的寫法非常簡潔優雅,只用了幾行程式碼就實現了同樣的功能。閉包寫法非常適合用來編寫非同步非阻塞回呼模式的伺服器程式。目前熱門的程式語言中只有PHP和JS具備這種能力。

閉包更多功能


        在類別的方法中使用匿名函數,且5.4以上的版本無需使用use引入$this,直接可以在匿名函數中使用$this來呼叫當前物件的方法。在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);
        }
    }
}
登入後複製

另外如果希望在閉包函數中修改外部變量,可以在use時為變量增加&引用符號即可。注意物件類型不需要加&,因為在PHP中物件預設就是傳引用而非傳值。

 更多PHP相關知識,請造訪PHP中文網

以上是PHP+Swoole的閉包寫法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1667
14
CakePHP 教程
1426
52
Laravel 教程
1328
25
PHP教程
1273
29
C# 教程
1255
24
C++ lambda 表達式中閉包的意思是什麼? C++ lambda 表達式中閉包的意思是什麼? Apr 17, 2024 pm 06:15 PM

在C++中,閉包是能夠存取外部變數的lambda表達式。若要建立閉包,請擷取lambda表達式中的外部變數。閉包提供可重複使用性、資訊隱藏和延遲求值等優點。它們在事件處理程序等實際情況中很有用,其中即使外部變數被銷毀,閉包仍然可以存取它們。

swoole協程如何在laravel使用 swoole協程如何在laravel使用 Apr 09, 2024 pm 06:48 PM

Laravel 中使用 Swoole 協程可以並發處理大量請求,優點包括:同時處理:允許同時處理多個請求。高效能:基於 Linux epoll 事件機制,高效處理請求。低資源消耗:所需伺服器資源更少。易於整合:與 Laravel 框架無縫集成,使用簡單。

C++ 函式中閉包的優點和缺點是什麼? C++ 函式中閉包的優點和缺點是什麼? Apr 25, 2024 pm 01:33 PM

閉包是一種巢狀函數,它能存取外層函數作用域的變量,優點包括資料封裝、狀態保持和靈活性。缺點包括記憶體消耗、效能影響和調試複雜性。此外,閉包還可以建立匿名函數,並將其作為回調或參數傳遞給其他函數。

swoole和workerman哪個好 swoole和workerman哪個好 Apr 09, 2024 pm 07:00 PM

Swoole 和 Workerman 都是高效能 PHP 伺服器框架。 Swoole 以其非同步處理、出色的效能和可擴展性而聞名,適用於需要處理大量並發請求和高吞吐量的專案。 Workerman 提供了非同步和同步模式的靈活性,具有直覺的 API,更適合易用性和處理較低並發量的專案。

swoole和java哪個表現好 swoole和java哪個表現好 Apr 09, 2024 pm 07:03 PM

效能比較:吞吐量:Swoole 以協程機制,吞吐量更高。延遲:Swoole 的協程上下文切換開銷更低,延遲更小。記憶體消耗:Swoole 的協程佔用記憶體較少。易用性:Swoole 提供更易於使用的並發程式設計 API。

C++ Lambda 表達式如何實作閉包? C++ Lambda 表達式如何實作閉包? Jun 01, 2024 pm 05:50 PM

C++Lambda表達式支援閉包,即保存函數作用域變數並供函數存取。語法為[capture-list](parameters)->return-type{function-body}。 capture-list定義要捕獲的變量,可以使用[=]按值捕獲所有局部變量,[&]按引用捕獲所有局部變量,或[variable1,variable2,...]捕獲特定變量。 Lambda表達式只能存取捕獲的變量,但無法修改原始值。

swoole協程是怎樣調度的 swoole協程是怎樣調度的 Apr 09, 2024 pm 07:06 PM

Swoole協程是一種輕量級並發函式庫,可讓開發者編寫並發程式。 Swoole協程調度機制基於協程模式和事件循環,使用協程堆疊管理協程執行,在協程讓出控制權後掛起它們。事件循環處理IO和定時器事件,協程讓出控制權時被掛起並返回事件循環。當事件發生時,Swoole從事件循環切換到掛起的協程,透過儲存和載入協程狀態完成切換。協程調度使用優先權機制,支援掛起、休眠和復原作業以靈活控制協程執行。

PHP 函數的鍊式呼叫與閉包 PHP 函數的鍊式呼叫與閉包 Apr 13, 2024 am 11:18 AM

是的,可以透過鍊式呼叫和閉包優化程式碼簡潔性和可讀性:鍊式呼叫可將函數呼叫連結為一個流暢介面。閉包可建立可重複使用程式碼區塊,並在函數外部存取變數。

See all articles