Maison >développement back-end >tutoriel php >Explication de la différence entre la fermeture PHP pour obtenir des variables externes et le mot-clé global pour déclarer des variables

Explication de la différence entre la fermeture PHP pour obtenir des variables externes et le mot-clé global pour déclarer des variables

jacklove
jackloveoriginal
2018-07-07 17:51:492359parcourir

La fermeture est un concept courant, et nous pouvons généralement l'utiliser avec des fonctions de rappel pour rendre le code plus concis et lisible. Cet article présente principalement la différence entre la fermeture PHP pour obtenir des variables externes et le mot-clé global pour déclarer des variables. Les amis dans le besoin peuvent s'y référer

Récemment, alors que j'apprenais Workerman, je suis entré davantage en contact avec les fonctions de rappel. fréquemment. Je les utilise souvent. Comme les Workers sont utilisés de différentes manières, ces deux méthodes différentes seront utilisées pour appeler des variables de Worker externes. Ici, nous allons trier les différences entre les fermetures PHP pour obtenir des variables externes et le mot-clé global pour déclarer des variables.

Fermeture

La fermeture est un concept courant, nous pouvons généralement l'utiliser avec des fonctions de rappel pour rendre le code plus concis et facile à lire.

Les fermetures permettent aux fonctions d'utiliser des variables dans la portée parent via la copie. Par exemple :

$global = 'hello';
$bbb = function()use($global){
  echo $global."\n";
};
$bbb();
//输出 'hello'

le mot-clé global déclare des variables

déclare des variables via global Le corps de la fonction peut également être appelé pour des variables extérieures à la fonction, mais global est différent de use. Le mot-clé global créera une référence avec le même nom que la variable externe, et les modifications apportées à la variable dans la fonction porteront également sur la variable externe. .

$global = 'hello';
$fun = function(){
  global $global;
  $global =' world';
  echo $global."\n";
};
$fun();
// 输出 'world'

Cela crée simplement une référence du même nom et ne change pas la portée de la variable externe d'origine $global, c'est-à-dire dans une autre fonction Appeler ceci nécessite toujours de déclarer ou d'utiliser une fermeture

$global = 'hello';
$fun = function(){
  global $global;
  $global =' world';
  echo 'a:'.$global."\n";
};
$ccc = function(){
  echo 'b:'.$global;
};
$fun()
$ccc()
/*

sortie

a: world
Notice: Undefined variable: global in xxxxxxx on line xx
*/

Modifiez légèrement le code pour qu'il soit plus facile de comparer les différences entre les fermetures et les déclarations de mots-clés globaux pour accéder aux variables externes.

<?php
$global = &#39;hello&#39;;
$fun = function(){
  global $global;
  $global =&#39;world&#39;;
  echo &#39;a:&#39;.$global."\n";
};
$bbb = function()use($global){
  $global = &#39;china&#39;;
  echo &#39;c:&#39;.$global."\n";
};
$fun();
echo &#39;b:&#39;.$global."\n";
$bbb();
echo &#39;d:&#39;.$global;

On peut voir à partir des deux sorties b et d que global modifie la valeur de la variable externe, mais pas la méthode de fermeture.

Sortie :

a: world
b: world
c:china
d: world

Enfin, je publierai une utilisation plus classique des fonctions anonymes, des fermetures et des fonctions de rappel dans les documents officiels Exemple :

class Cart
{
  const PRICE_BUTTER = 1.00;
  const PRICE_MILK  = 3.00;
  const PRICE_EGGS  = 6.95;
  protected  $products = array();
  public function add($product, $quantity)
  {
    $this->products[$product] = $quantity;
  }
  public function getQuantity($product)
  {
    return isset($this->products[$product]) ? $this->products[$product] :
      FALSE;
  }
  public function getTotal($tax)
  {
    $total = 0.00;
    $callback =
      function ($quantity, $product) use ($tax, &$total)
      {
        $pricePerItem = constant(__CLASS__ . "::PRICE_" .
          strtoupper($product));
        $total += ($pricePerItem * $quantity) * ($tax + 1.0);
      };
    array_walk($this->products, $callback);
    return round($total, 2);
  }
}
$my_cart = new Cart;
$my_cart->add(&#39;butter&#39;, 1);
$my_cart->add(&#39;milk&#39;, 3);
$my_cart->add(&#39;eggs&#39;, 6);
print $my_cart->getTotal(0.05) . "\n";

Résumé

Ce qui précède est ce que l'éditeur vous donne. La fermeture PHP introduite obtient la différence entre les variables externes et les variables globales de déclaration de mots-clés. J'espère que cela sera utile à tout le monde. Si vous avez des questions, veuillez me laisser 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 :

Explication détaillée de l'utilisation d'anyproxy pour améliorer l'efficacité de la collecte d'articles de comptes publics

Explication sur la façon de collecter les pages d'articles du compte public WeChat à l'aide de PHP

Explication détaillée sur la façon de collecter les pages de messages historiques du compte public WeChat

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