Maison  >  Article  >  développement back-end  >  A quoi servent les fermetures php ?

A quoi servent les fermetures php ?

青灯夜游
青灯夜游original
2019-10-10 16:02:243262parcourir

Qu'est-ce qu'une fermeture PHP ? A quoi ça sert ? L'article suivant vous présentera les fermetures php. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

A quoi servent les fermetures php ?

Qu'est-ce qu'une fermeture php ?

L'implémentation de la fermeture PHP repose principalement sur des fonctions anonymes

La fonction anonyme est transmise sous forme de nombre dans la fonction ordinaire et peut également être renvoyée. Cela permet d'obtenir une fermeture simple. .

En termes simples : les fonctions enfants peuvent utiliser des variables locales dans la fonction parent. Ce comportement est appelé fermeture !

Deux points de fermeture :

1. En référence à une variable de fonction - lorsque la fonction revient, elle est à l'état actif ?

2. La fermeture est une zone de pile qui ne libère pas de ressources lors du retour d'une fonction.

En fait, les deux points ci-dessus peuvent être combinés en un seul point, c'est-à-dire que lorsque la fonction de fermeture revient, les variables internes de la fonction sont activés et la zone de pile où se trouve la fonction est toujours conservée.

A quoi servent les fermetures php ?

L'implémentation de la fermeture PHP peut non seulement lire les variables à l'intérieur de la fonction, mais aussi toujours enregistrer les variables dans la mémoire, de sorte que les variables existeront toujours même après l'exécution de la fonction.

Plusieurs fonctions de fermetures :

1 Réduire le code de la boucle foreach

Par exemple, manuel L'exemple. dans http://php.net/manual/en/functions.anonymous.php se trouve Cart

<?php
// 一个基本的购物车,包括一些已经添加的商品和每种商品的数量。
// 其中有一个方法用来计算购物车中所有商品的总价格。该方法使用了一个closure作为回调函数。
class Cart
{
    constPRICE_BUTTER  = 1.00;
    constPRICE_MILK    = 3.00;
    constPRICE_EGGS    = 6.95;
 
    protected  $products = array();
     
    publicfunction add($product,$quantity)
    {
        $this->products[$product] =$quantity;
    }
     
    publicfunction getQuantity($product)
    {
        returnisset($this->products[$product]) ?$this->products[$product] :
               FALSE;
    }
     
    publicfunction 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);
        returnround($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);
 
// 打出出总价格,其中有 5% 的销售税.
print $my_cart->getTotal(0.05) . "\n";
// The result is 54.29
?>

Si on transforme la fonction getTotal, il faut utiliser foreach

2. paramètres de fonction

function html ($code , $id="",$class=""){
 
if ($id !== "") $id= " id = \"$id\"" ;
 
$class = ($class !== "")? " class =\"$class\"":">";
 
$open = "<$code$id$class";
 
$close = "</$code>";
 
return function ($inner= "")use ($open,$close){
 
return "$open$inner$close";};
 
}

Si nous utilisons la méthode habituelle, nous mettrons inner dans les paramètres de fonction html, de sorte que qu'il s'agisse de lire ou d'utiliser le code, il est préférable d'utiliser des fermetures

3. Libérez la fonction récursive

<?php
    $fib= function($n)use(&$fib) {
        if($n== 0 || $n == 1) return 1;
        return$fib($n- 1) + $fib($n- 2);
    };
 
   echo$fib(2) . "\n";// 2
   $lie= $fib;
   $fib= function(){die(&#39;error&#39;);};//rewrite $fib variable
   echo$lie(5); // error   because $fib is referenced by closure

Notez que l'utilisation dans la question ci-dessus utilise & Si & n'est pas utilisé ici, l'erreur n-1) ne sera pas trouvée (fib est non défini précédemment) type)

Donc, lorsque vous souhaitez utiliser une fermeture pour libérer une fonction de boucle, vous devez utiliser la forme

<?php
$recursive= function () use (&$recursive){
// The function is now available as $recursive
}

4. À propos de la liaison retardée

Si vous devez retarder la liaison des variables en cours d'utilisation, vous devez utiliser des références, sinon une copie sera faite et utilisée lors de la définition de

<?php
$result = 0;
 
$one = function()
{ var_dump($result); };
 
$two = function() use ($result)
{ var_dump($result); };
 
$three = function() use (&$result)
{ var_dump($result); };
 
$result++;
 
$one();   // outputs NULL: $result is not in scope
$two();   // outputs int(0): $result was copied
$three();   // outputs int(1)

Utilisation des références et ne pas les utiliser La référence indique si la valeur est attribuée lors de l'appel ou lorsque la fonction est déclarée

Pour plus de connaissances sur PHP, veuillez visiter le Site Web PHP chinois  !

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
Article précédent:que signifie la fonction phpArticle suivant:que signifie la fonction php