Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Verwendungsmethoden in PHP-Closure function() use()

Detaillierte Verwendungsmethoden in PHP-Closure function() use()

亚连
亚连Original
2018-05-17 13:42:2012513Durchsuche

PHPs Schließung (Closure) ist auch eine anonyme Funktion . Es wurde in PHP5.3 eingeführt.

Die Syntax des Abschlusses ist sehr einfach. Das einzige Schlüsselwort, das Aufmerksamkeit erfordert, ist die Verwendung von Mitteln zum Verbinden des Abschlusses und externer Variablen.

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

Mehrere Funktionen des Abschlusses:

1 Reduzieren Sie den Code der foreach-Schleife

[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  
?>

Wenn wir hier die getTotal-Funktion transformieren, müssen wir foreach

verwenden 2 Reduzieren Sie die Parameter der -Funktion

[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";};  
}

. Wenn wir die übliche Methode verwenden, fügen wir die inneren -Funktionsparameter in den HTML-Code ein, sodass es sich um Code handelt Lesen oder verwenden Es ist besser, Abschlüsse

3 zu verwenden, um die rekursive Funktion abzubrechen

[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

Beachten Sie, dass die Verwendung in der obigen Frage & verwendet. Es tritt ein Fehler auf. n-1) Ja Die Funktion kann nicht gefunden werden (der Fib-Typ wurde zuvor nicht definiert)

Wenn Sie also einen Abschluss verwenden möchten, um die Schleifenfunktion abzubrechen, müssen Sie das Formular verwenden

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

4 Über Lazy Binding

Wenn Sie verwendete Variablen träge binden müssen, müssen Sie Referenzen verwenden, andernfalls wird eine Kopie erstellt und in Gebrauch genommen definieren

[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)

Referenzen verwenden Und keine Referenzen zu verwenden bedeutet Zuweisung beim Aufruf oder Zuweisen bei der Deklaration

Das Obige ist die detaillierte Verwendungsmethode der PHP-Verschlussfunktion() use(), die ich für Sie kompiliert habe. Ich hoffe, dass es Ihnen in Zukunft nützlich sein wird.

Verwandte Artikel:

PHP-Interviewfragen (klassisch)

Designideen und Mängel von PHP-Namespaces

Detailliertes Beispiel für die Verwendung von Websocket in PHP

Das obige ist der detaillierte Inhalt vonDetaillierte Verwendungsmethoden in PHP-Closure function() use(). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn