ホームページ  >  記事  >  バックエンド開発  >  PHP+Swoole でクロージャを記述する方法

PHP+Swoole でクロージャを記述する方法

angryTom
angryTom転載
2019-10-15 09:26:102454ブラウズ

JS プログラマは、クロージャがない PHP をいつも笑いますが、今日は時間をかけて、PHP のクロージャを具体的に紹介する記事を書きました。 PHP はバージョン 5.3 から匿名関数のサポートを追加し、いくつかのバージョンと現在の 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";
});

伝統的な非クロージャの書き方、まずは関数を宣言し、関数名の文字列を入力します。 2 つのコードは分離されており、十分に直感的ではありません。クロージャ メソッドはタイマーの宣言とタイマーによって実行されるコードを一緒に記述しており、ロジックは非常に明確で直感的です。クロージャー構文を使用すると、コールバック関数を簡単に作成できます。ユーザーが実行コードを渡す必要があるイベント駆動型プログラミング、ソート、array_walk などのシナリオでは、クロージャは非常にエレガントに記述されます。

クロージャのさらに強力な点は、呼び出しサイトで外部変数を直接導入できることです。 PHP で実装されるメソッドは us​​e キーワードです。

構文を使用する


タイマーが変数を渡す必要がある場合、従来の書き込み方法はグローバル変数を使用することによってのみ実現できます。 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 変数 (グローバル グローバル変数は使用しません)。さらに、swoole のイベント駆動型プログラミング モードを使用している場合、グローバル グローバル変数が 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 以降では、$this を導入するために use を使用する必要はありません。匿名関数を使用する 関数内で $this を使用して、現在のオブジェクトのメソッドを呼び出します。 swoole プログラミングでは、この機能を使用して、$serv オブジェクトの使用の導入と受け渡しを減らすことができます。

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

また、クロージャー関数内で外部変数を変更したい場合は、使用時に変数に&参照記号を追加することができます。 PHP ではオブジェクトはデフォルトで値ではなく参照によって渡されるため、オブジェクト タイプを追加する必要がないことに注意してください。

PHP 関連の知識の詳細については、PHP 中国語 Web サイト をご覧ください。

以上がPHP+Swoole でクロージャを記述する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はrango.swoole.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。