JS-Programmierer lachen immer über PHP, weil es keine Abschlüsse gibt. Heute habe ich mir die Zeit genommen, einen Artikel zu schreiben, der speziell Abschlüsse in PHP vorstellt. PHP hat seit Version 5.3 Unterstützung für anonyme Funktionen hinzugefügt. Nach mehreren Versionen und Iterationen der aktuellen PHP5.6 und PHP7 ist die Schließung der PHP-Sprache sehr vollständig. In Kombination mit der ereignisgesteuerten Unterstützung von Swoole ist die Abschlussfunktion von PHP sehr leistungsstark und elegant.
Die anonyme Funktion ist der Kern der Schließung. Die anonyme Funktion ist in PHP tatsächlich ein Objekt der Closure-Klasse (bitte beachten Sie, dass es sich um ein Objekt handelt). ). Anders als bei der gewöhnlichen objektorientierten Programmierung wird der Code der anonymen Funktion direkt am Aufrufpunkt geschrieben. Es ist nicht erforderlich, eine zusätzliche Klasse zu schreiben oder den Code der Methode zu schreiben. Dies hat den Vorteil, dass es direkter ist. Im folgenden Beispiel wird ein Timer so eingestellt, dass er alle 2 Sekunden „Hallo Welt“ ausgibt.
Traditionelles Schreiben
function timer () { echo "hello world"; } Swoole\Timer::tick(2000, 'timer');
Abschlussschreiben
Swoole\Timer::tick(2000, function () { echo "hello world"; });
Traditionelles Schreiben von Nicht-Abschluss, zuerst eine Funktion deklarieren , und geben Sie dann die Funktionsnamenzeichenfolge ein. Die beiden Codeteile sind getrennt und nicht intuitiv genug. Die Abschlussmethode schreibt die Deklaration des Timers und den vom Timer auszuführenden Code zusammen, und die Logik ist sehr klar und intuitiv. Die Verwendung der Abschlusssyntax erleichtert das Schreiben von Rückruffunktionen. In Szenarien wie ereignisgesteuerter Programmierung, Sortierung, array_walk usw., in denen Benutzer einen Teil des Ausführungscodes übergeben müssen, werden Abschlüsse sehr elegant geschrieben.
Das Stärkere an der Schließung ist, dass sie externe Variablen direkt an der Aufrufstelle einführen kann. Die in PHP implementierte Methode ist das Schlüsselwort use.
Wenn der Timer gerade eine Variable übergeben muss, kann die herkömmliche Schreibmethode nur durch globale Variablen erreicht werden. Im Gegensatz zu JS ist die Variableneinführung in PHP explizit. Wenn Sie auf externe Variablen verweisen möchten, müssen Sie diese mit „use“ deklarieren. JS ist implizit und externe Variablen können innerhalb anonymer Funktionen ohne Deklaration frei manipuliert werden. Dies hat den Vorteil, dass Sie weniger Code schreiben müssen, der Nachteil ist jedoch, dass es riskant und verwirrend ist.
Traditionelles Schreiben
$str = "hello world"; function timer () { global $str; echo $str; } Swoole\Timer::tick(2000, 'timer');
Abschlussschreiben
$str = "hello world"; Swoole\Timer::tick(2000, function () use ($str) { echo $str; });
Abschlussschreiben verwendet use, um die aktuelle $str-Variable direkt einzuführen, ohne Verwendung globaler globaler Variablen. Wenn Sie sich außerdem im ereignisgesteuerten Programmiermodus von Swoole befinden, können Sie mit Global keine asynchrone Parallelität erreichen, da es nur eine globale globale Variable gibt. Wenn mehrere Clientanforderungen gleichzeitig vorliegen, muss jede Anforderung die Datenbank abfragen und unterschiedliche Inhalte ausgeben. Die herkömmliche Programmiermethode ist nicht einfach zu implementieren. Sie müssen ein globales Variablenarray verwenden, um die entsprechenden Daten mit der Client-ID als SCHLÜSSEL zu speichern.
Traditionelles Schreiben
$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');
Abschlussschreiben
$server->on('request', function ($request, $response) { $queryId = $db->query($sql, function ($queryId, $queryResult) use ($request, $response) { $response->end($queryResult); }); });
Das traditionelle Schreiben ist sehr kompliziert und muss viele Male wiederholt werden das globale Array Daten speichern/extrahieren. Die Schreibmethode des Abschlusses ist sehr prägnant und elegant und es sind nur wenige Codezeilen erforderlich, um dieselbe Funktion zu erreichen. Das Schreiben von Schließungen eignet sich sehr gut zum Schreiben von Serverprogrammen im asynchronen, nicht blockierenden Rückrufmodus. Derzeit verfügen nur PHP und JS unter den gängigen Programmiersprachen über diese Fähigkeit.
Die Verwendung anonymer Funktionen in Klassenmethoden ab Version 5.4 ist nicht erforderlich, um $this einzuführen, Sie können dies direkt tun anonym verwenden Verwenden Sie $this in der Funktion, um die Methode des aktuellen Objekts aufzurufen. In der Swoole-Programmierung kann diese Funktion verwendet werden, um die Einführung und Übergabe des $serv-Objekts zu reduzieren.
class Server extends Swoole\Server { function onReceive($serv, $fd, $reactorId, $data) { $db->query($sql, function ($queryId, $queryResult) use ($fd) { $this->send($fd, $queryResult); } } }
Wenn Sie außerdem externe Variablen in der Abschlussfunktion ändern möchten, können Sie bei der Verwendung das &-Referenzsymbol zur Variablen hinzufügen. Beachten Sie, dass der Objekttyp nicht hinzugefügt werden muss, da Objekte in PHP standardmäßig als Referenz und nicht als Wert übergeben werden.
Weitere PHP-bezogene Kenntnisse finden Sie auf der PHP-Chinese-Website!
Das obige ist der detaillierte Inhalt vonSo schreiben Sie Abschlüsse in PHP+Swoole. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!