Maison > développement back-end > tutoriel php > Comment écrire des fermetures en PHP+Swoole

Comment écrire des fermetures en PHP+Swoole

angryTom
Libérer: 2023-04-07 16:00:01
avant
2531 Les gens l'ont consulté

Les programmeurs JS se moquent toujours de PHP parce qu'il n'a pas de fermetures. Aujourd'hui, j'ai pris le temps d'écrire un article pour présenter spécifiquement les fermetures en PHP. PHP a ajouté le support des fonctions anonymes depuis la version 5.3. Après plusieurs versions et itérations des PHP5.6 et PHP7 actuels, la fermeture du langage PHP a été très complète. Combinée au support événementiel fourni par Swoole, la fonction de fermeture de PHP est très puissante et élégante.

Fonction anonyme


La fonction anonyme est au cœur de la fermeture. La fonction anonyme en PHP est en fait un objet de la classe Closure (veuillez noter qu'il s'agit d'un objet. ) . Contrairement à la programmation orientée objet ordinaire, le code de la fonction anonyme est écrit directement au point appelant. Il n'est pas nécessaire d'écrire une classe supplémentaire ou d'écrire le code de la méthode. L’avantage est que c’est plus direct. L'exemple suivant définit une minuterie pour afficher Hello World toutes les 2 secondes.

Écriture traditionnelle

function timer () {
    echo "hello world";
}
Swoole\Timer::tick(2000, 'timer');
Copier après la connexion

Écriture de clôture

Swoole\Timer::tick(2000, function () {
    echo "hello world";
});
Copier après la connexion

Écriture traditionnelle de non-fermeture, déclarer d'abord une fonction , puis entrez la chaîne du nom de la fonction. Les deux morceaux de code sont séparés et pas assez intuitifs. La méthode de fermeture écrit ensemble la déclaration du timer et le code à exécuter par le timer, et la logique est très claire et intuitive. L'utilisation de la syntaxe de fermeture facilite l'écriture de fonctions de rappel. Dans des scénarios tels que la programmation événementielle, le tri, array_walk, etc. qui nécessitent que les utilisateurs transmettent un morceau de code d'exécution, les fermetures sont écrites de manière très élégante.

La chose la plus puissante à propos de la fermeture est qu'elle peut introduire des variables externes directement sur le site d'appel. La méthode implémentée en PHP est le mot-clé use.

Utiliser la syntaxe


Si le minuteur doit juste maintenant transmettre une variable, la méthode d'écriture traditionnelle ne peut être obtenue que via des variables globales. Contrairement à JS, l'introduction des variables de PHP est explicite. Si vous souhaitez référencer des variables externes, vous devez utiliser use pour les déclarer. JS est implicite et les variables externes peuvent être librement manipulées dans des fonctions anonymes sans déclaration. L’avantage est que vous écrivez moins de code, mais l’inconvénient est que cela est risqué et déroutant.

Écriture traditionnelle

$str = "hello world";
function timer () {
    global $str;
    echo $str;
}
Swoole\Timer::tick(2000, 'timer');
Copier après la connexion

Écriture de fermeture

$str = "hello world";
Swoole\Timer::tick(2000, function () use ($str) {
    echo $str;
});
Copier après la connexion

L'écriture de fermeture utilise use pour introduire directement la variable $str actuelle, sans en utilisant des variables globales globales. De plus, si vous êtes dans le mode de programmation événementielle de swoole, vous ne pouvez pas obtenir une concurrence asynchrone en utilisant global, car il n'y a qu'une seule variable globale globale. S'il y a plusieurs requêtes client en même temps, chaque requête doit interroger la base de données. et produire un contenu différent. Traditionnel La méthode de programmation n'est pas facile à mettre en œuvre. Vous devez utiliser un tableau de variables globales pour enregistrer les données respectives avec l'ID du client comme clé.

Écriture traditionnelle

$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');
Copier après la connexion

Écriture de clôture

$server->on('request', function ($request, $response) {
    $queryId = $db->query($sql, function ($queryId, $queryResult) use ($request, $response) {
        $response->end($queryResult);
    });
});
Copier après la connexion

L'écriture traditionnelle est très compliquée et doit être répétée plusieurs fois à partir de le tableau global Enregistrer/extraire les données. La méthode d'écriture de fermeture est très concise et élégante, et il suffit de quelques lignes de code pour réaliser la même fonction. L'écriture de fermeture est très adaptée à l'écriture de programmes serveur en mode de rappel asynchrone non bloquant. Actuellement, seuls PHP et JS parmi les langages de programmation populaires disposent de cette capacité.

Plus de fonctionnalités des fermetures


Utilisez des fonctions anonymes dans les méthodes de classe Les versions 5.4 et supérieures n'ont pas besoin d'utiliser use pour introduire $this, vous pouvez directement. utiliser anonyme Utilisez $this dans la fonction pour appeler la méthode de l'objet actuel. En programmation swoole, cette fonctionnalité peut être utilisée pour réduire l'utilisation de l'introduction et du passage de l'objet $serv.

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

De plus, si vous souhaitez modifier des variables externes dans la fonction de fermeture, vous pouvez ajouter le symbole de référence & à la variable lors de l'utilisation. Notez que le type d'objet n'a pas besoin d'être ajouté, car en PHP, les objets sont passés par référence au lieu de valeur par défaut.

Pour plus de connaissances sur PHP, veuillez visiter le Site Web PHP chinois !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:rango.swoole.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal