Maison  >  Article  >  développement back-end  >  Analyse des fermetures et des fonctions anonymes en PHP

Analyse des fermetures et des fonctions anonymes en PHP

小云云
小云云original
2017-12-25 16:42:061449parcourir

Une fermeture est une fonction qui encapsule l'état environnant lors de sa 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 fermetures PHP et les fonctions anonymes utilisent la même syntaxe que les fonctions ordinaires, mais les fermetures et les fonctions anonymes sont en réalité des objets (instances de la classe Closure) déguisés en fonctions. Laissez-moi vous présenter les connaissances sur les fermetures et les fonctions anonymes en PHP. Les amis qui en ont besoin peuvent s'y référer. J'espère que cela pourra aider tout le monde.

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éation d'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 l'assigne à 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 recherchera 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);
Statut supplémentaire

Les fermetures PHP n'encapsulent pas automatiquement l'état de l'application comme les vraies fermetures javascrypt. Nous devons appeler manuellement la méthode bindTo() de l'objet de fermeture ou utiliser le mot-clé use pour attacher l'état à la fermeture PHP. .

Utilisez le mot-clé use

Il est plus courant d'utiliser le mot-clé use pour attacher l'état de fermeture, nous allons donc d'abord examiner 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, utilisez des virgules pour séparer plusieurs paramètres comme les paramètres d'une fonction ou d'une méthode PHP.

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

Semblable à d'autres objets PHP, chaque instance de fermeture peut utiliser le mot-clé $this pour obtenir 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
*/
Recommandations associées :

Comment utiliser les fermetures pour obtenir des variables externes en PHP

Compréhension approfondie des fermetures javascript

Que sont les fonctions anonymes, les fonctions imbriquées et les fermetures

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