PHP Fermetures


Exemple

Une fermeture est une fonction anonyme qui ne peut pas accéder à une portée externe.

Lorsque vous définissez une fonction anonyme en tant que telle, vous créez un "espace de noms" pour cette fonction. Il n'a actuellement accès qu'à cet espace de noms.

$externalVariable = "Hello";
$secondExternalVariable = "Foo"; 
$myFunction = function() { 
  
  var_dump($externalVariable, $secondExternalVariable); // returns two error notice, since the variables aren´t defined 

}

Il n'a accès à aucune variable externe. Pour accorder cette autorisation d'accès à cet espace de noms aux variables externes, vous devez l'introduire via des fermetures ( use() ).

$myFunction = function() use($externalVariable, $secondExternalVariable) {
   var_dump($externalVariable, $secondExternalVariable); // Hello Foo
}

Ceci est largement attribué à la portée variable de PHP - Si une variable n'est pas définie dans la portée, ou n'est pas intégrée à la variable global elle n'existe pas.

Notez également:

Hériter des variables de la portée parent n'est pas la même chose que d'utiliser des variables globales. Les variables globales existent dans la portée globale, qui est la même quelle que soit la fonction en cours d'exécution.

La portée parent d'une fermeture est la fonction dans laquelle la fermeture a été déclarée (pas nécessairement la fonction à partir de laquelle elle a été appelée).

Tiré de la documentation PHP pour les fonctions anonymes


En PHP, les fermetures utilisent une approche de liaison anticipée . Cela signifie que les variables transmises à l'espace de noms de la fermeture à l'aide du mot clé use auront les mêmes valeurs lors de la définition de la fermeture.

Pour modifier ce comportement, vous devez passer la variable par référence .

$rate = .05;

// Exports variable to closure's scope
$calculateTax = function ($value) use ($rate) {
    return $value * $rate;
};

$rate = .1; 

print $calculateTax(100); // 5
$rate = .05;

// Exports variable to closure's scope
$calculateTax = function ($value) use (&$rate) { // notice the & before $rate
    return $value * $rate;
};

$rate = .1;

print $calculateTax(100); // 10

Les arguments par défaut ne sont pas implicitement requis lors de la définition de fonctions anonymes avec / sans fermeture.

$message = 'Im yelling at you';

$yell = function() use($message) {
    echo strtoupper($message);
};

$yell(); // returns: IM YELLING AT YOU