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

Comment écrire des fermetures en PHP+Swoole

angryTom
angryTomavant
2019-10-15 09:26:102454parcourir

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');

Écriture de clôture

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

É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');

Écriture de fermeture

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

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');

Écriture de clôture

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

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);
        }
    }
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer