Maison  >  Article  >  développement back-end  >  Une brève analyse des fermetures et des fonctions anonymes en PHP

Une brève analyse des fermetures et des fonctions anonymes en PHP

jacklove
jackloveoriginal
2018-07-04 18:00:071427parcourir

Les fermetures PHP et les fonctions anonymes utilisent la même syntaxe que les fonctions ordinaires, mais les fermetures et les fonctions anonymes sont en fait des objets (instances de la classe Closure) déguisés en fonctions. Laissez-moi vous présenter la connaissance des fermetures et des fonctions anonymes en PHP. Les amis qui en ont besoin peuvent s'y référer

Les fermetures font référence à des fonctions qui encapsulent l'état environnant lors de leur création. Même si l’environnement dans lequel se situe la fermeture n’existe plus, l’état encapsulé dans la fermeture existe toujours.

Les fonctions anonymes sont des fonctions sans noms. Les fonctions anonymes peuvent être attribuées à des variables et transmises comme n'importe quel autre objet PHP. Cependant, les fonctions anonymes restent des fonctions, elles peuvent donc être appelées et des paramètres peuvent être transmis. Les fonctions anonymes sont particulièrement adaptées comme rappels de fonctions ou de méthodes.

Remarque : En théorie, les fermetures et les fonctions anonymes sont des concepts différents. Cependant, PHP le traite comme le même concept. Par conséquent, lorsque nous parlons de fermetures, nous faisons également référence à des fonctions anonymes, et vice versa.

Les fermetures PHP et les fonctions anonymes utilisent la même syntaxe que les fonctions ordinaires, mais les fermetures et les fonctions anonymes sont en fait des objets (instances de la classe Closure) déguisés en fonctions.

Créer une fermeture

$closure = function($name){
  return sprintf("Hello %s", $name);
}
echo $closure("jerry");
// 检测$closure变量是否是一个闭包
var_dump($closure instanceof Closure);

Le code ci-dessus crée un objet de fermeture, puis attribuez-le à la variable $closure. Les fermetures sont très similaires aux fonctions PHP ordinaires. Elles utilisent la même syntaxe, reçoivent des paramètres et peuvent renvoyer des valeurs.

Explication : La raison pour laquelle nous pouvons appeler la variable $closure est que la valeur de cette variable est une fermeture et que l'objet de fermeture implémente la méthode magique __invoke(). Tant qu'il y a () après le nom de la variable, PHP trouvera et appellera la méthode __invoke() .

Utilisation des fermetures

Nous utilisons généralement les fermetures PHP comme rappels pour les fonctions et les méthodes. De nombreuses fonctions PHP utilisent des fonctions de rappel, telles que array_map() et preg_replace_callback() Dans l'exemple suivant, nous utiliserons array_map() pour traiter le tableau et incrémenter chaque élément du tableau de 1 :

$nubmers = array_map(function($number){
  return $number++;
}, [1,2,3]);
var_dump($numbers);

État ajouté

Les fermetures PHP n'encapsulent pas automatiquement l'état de l'application comme le font les vraies fermetures javascrypt, nous devons attacher un état à une fermeture PHP en appelant manuellement la méthode bindTo() de l'objet de fermeture ou en utilisant le mot-clé use.

Utilisation du mot-clé use

Il est plus courant d'utiliser le mot-clé use pour attacher l'état de fermeture, examinons donc d'abord cette méthode. Lorsque vous attachez une variable à une fermeture à l'aide du mot-clé use, la variable attachée mémorise la valeur qui lui est attribuée lorsqu'elle est attachée.

function Car ($name){
  return function($statu)use($name){
    return sprintf("Car %s is %s", $name, $statu); 
  }
}
// 将车名封装在闭包中
$car = Car("bmw");
// 调用车的动作
// 输出--> "bmw is running"
echo $car("running");

Remarque : utilisez le mot-clé use pour transmettre plusieurs paramètres dans la fermeture. Dans ce cas, tout comme les paramètres d'une fonction ou d'une méthode PHP, utilisez des virgules pour séparer plusieurs paramètres.

Utilisez la méthode bindTo() pour attacher l'état de la fermeture

Semblable à d'autres objets PHP, chaque instance de fermeture peut utiliser $this Le mot-clé obtient l'état interne de la fermeture. L'état par défaut de l'objet de fermeture est inutile, mais il existe une méthode magique __invoke() et une méthode bindTo().

La méthode bindTo() ajoute un potentiel intéressant aux fermetures. Nous pouvons utiliser cette méthode pour lier l’état interne de l’objet Closure à d’autres objets.

Le deuxième paramètre de la méthode bindTo() est très important. Sa fonction est de spécifier la classe PHP à laquelle appartient l'objet de la fermeture de liaison. Par conséquent, une fermeture peut accéder aux variables membres protégées et privées de l’objet auquel la fermeture est liée.

class TestClosure
{
  private $name=[];
  private $age;
  private $sex;
  public function addPerson($name, $personCallback){
    // 将闭包对象绑定当前实例
    $this->name[$name] = $personCallback->bindTo($this, __CLASS__);
  }
  public function display($name){
    foreach ($this->name as $key => $callback){
      if($key == $name){
        // 执行闭包对象,将闭包状态附加到类
        $callback();
      }
    }
    echo "name : {$name}\n";
    echo "age : {$this->age}\n";
    echo "sex : {$this->sex}\n";
  }
}
$person = new TestClosure();
$person->addPerson("jerry", function(){
  $this->age = 19;
  $this->sex = "man";
});
$person->display("jerry");
/** output
name : jerry
age : 19
sex : man
*/

Résumé

Ce qui précède est ce que l'éditeur vous a présenté Fermetures et des fonctions anonymes en PHP, j'espère que cela sera utile à tout le monde. Si vous avez des questions, laissez-moi un message et l'éditeur vous répondra à temps. Je voudrais également vous remercier tous pour votre soutien au site Web php chinois !

Articles qui pourraient vous intéresser :

Analyse du code source et explication des raisons pour lesquelles Laravel exécute à plusieurs reprises la même tâche de file d'attente

Explication détaillée du problème de plusieurs processus récupérant des files d'attente en même temps dans Laravel Redis

Explication détaillée du code source php-msf


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:
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