Maison  >  Article  >  développement back-end  >  Fermetures PHP et fonctions anonymes (Tutoriel détaillé)

Fermetures PHP et fonctions anonymes (Tutoriel détaillé)

亚连
亚连original
2018-06-08 15:35:491650parcourir

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é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 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 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 l'utiliser. Le mot-clé use attache un état à une fermeture PHP.

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, 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 $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
*/
J'ai compilé ce qui précède pour vous, j'espère que cela vous sera utile à l'avenir.

Articles associés :

À propos des événements personnalisés dans les composants Vue (tutoriel détaillé)

Comment utiliser JS pour implémenter un petit suivi de balle la souris Mobile

Introduction détaillée à l'utilisation de base de NW.js

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