Maison  >  Article  >  développement back-end  >  Méthodes d'utilisation détaillées dans la fonction de fermeture PHP() use()

Méthodes d'utilisation détaillées dans la fonction de fermeture PHP() use()

亚连
亚连original
2018-05-17 13:42:2012559parcourir

La fermeture de PHP (Closure) est aussi fonction anonyme . Il a été introduit dans PHP5.3.

La syntaxe de la fermeture est très simple. Le seul mot-clé qui nécessite une attention particulière est use. Utiliser des moyens pour connecter la fermeture et les variables externes.

[php] view plain copy
$a =function()use($b) {  
}

Plusieurs fonctions de fermeture :

1 Réduire le code de la boucle foreach

[php] view plain copy
<?php  
// 一个基本的购物车,包括一些已经添加的商品和每种商品的数量。  
// 其中有一个方法用来计算购物车中所有商品的总价格。该方法使用了一个closure作为回调函数。  
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);  
// 打出出总价格,其中有 5% 的销售税.  
print $my_cart->getTotal(0.05) . "\n";  
// The result is 54.29  
?>

Ici si on transforme la fonction getTotal, il faut utiliser foreach

2 Réduire les paramètres de la fonction

[php] view plain copy
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 on utilise la méthode habituelle, on mettra l'intérieur dans les paramètres de la fonction html, comme ça Qu'il s'agisse de lecture ou d'utilisation de code, il est préférable d'utiliser des fermetures

3 Déverrouillagefonction récursive

[php] view plain copy
<?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 & , qui n'est pas utilisé ici. Il y aura une erreur n-1) La fonction est introuvable (le type de fib n'a pas été défini précédemment)

, donc quand vous voulez utiliser une fermeture pour annuler la boucle fonction, vous devez utiliser

[php] view plain copy
<?php  
$recursive =function ()use (&$recursive){  
// The function is now available as $recursive  
}

comme ceci La forme de

4 À propos de la liaison retardée

Si vous devez retarder la liaison des variables utilisées, vous devez utiliser des références, sinon une copie sera faite et mise en service lors de la définition. Dans

[php] view plain copy
<?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)

utiliser une référence ou ne pas utiliser une référence représente si la valeur est attribuée lors de l'appel ou lors de la déclaration de

Ce qui précède est PHPFermeture function() use() J'ai compilé pour tout le monde Méthode d'utilisation détaillée dans , J'espère que cela sera utile à tout le monde à l'avenir.

Articles connexes :

Questions d'entretien PHP (classique)

Idées de conception et lacunes des espaces de noms PHP

Exemple détaillé d'utilisation de websocket en php

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