Heim >Backend-Entwicklung >PHP-Tutorial >Detaillierte Erläuterung von PHP-Verschlüssen und Beispielen für Verschlussmethoden

Detaillierte Erläuterung von PHP-Verschlüssen und Beispielen für Verschlussmethoden

伊谢尔伦
伊谢尔伦Original
2017-07-01 12:00:441297Durchsuche

Dieser Artikel stellt Ihnen hauptsächlich die in PHP5.3 eingeführte anonyme Funktion vor, nämlich den Abschluss (Closure), und ich empfehle ihn Freunden in Not sehr detailliert . ihnen.

PHPs Abschluss (Closure) ist eine anonyme Funktion, die in PHP5.3 eingeführt wurde.

Die Syntax des Abschlusses ist sehr einfach. Das einzige Schlüsselwort, auf das Sie achten müssen, ist die Verwendung, um den Abschluss und externe Variablen zu verbinden.

Der Code lautet wie folgt:

$a = function() use($b) {}

Ein einfaches Beispiel lautet wie folgt:

function callback($fun) {
$fun();
}
$msg = "Hello, everyone";
$fun = function () use($msg) {
print "This is a closure use string value, msg is: $msg. <br />/n";
};
$msg = "Hello, everybody";
callback($fun);

Das Ergebnis ist: Dies ist ein Zeichenfolgenwert für die Schließung, msg lautet: Hallo zusammen. < ;br />/n

In der neu geöffneten Abschlusssyntax von PHP verwenden wir use, um außerhalb des Abschlusses definierte Variablen zu verwenden. Hier verwenden wir die externe Variable $msg. Nachdem sie definiert wurde, wird ihr Wert geändert. Nach der Ausführung des Abschlusses wird der ursprüngliche Wert ausgegeben. Für grundlegende Typparameter, die in der Wertübergabemethode übergeben werden, wird der Wert der Schließungsverwendung bestimmt, wenn die Schließung erstellt wird.

Die kleine Anwendung lautet wie folgt:

Der Code lautet wie folgt:

/** 
 * 一个利用闭包的计数器产生器 
 * 这里其实借鉴的是python中介绍闭包时的例子... 
 * 我们可以这样考虑: 
 *      1. counter函数每次调用, 创建一个局部变量$counter, 初始化为1. 
 *      2. 然后创建一个闭包, 闭包产生了对局部变量$counter的引用. 
 *      3. 函数counter返回创建的闭包, 并销毁局部变量, 但此时有闭包对$counter的引用,  
 *          它并不会被回收, 因此, 我们可以这样理解, 被函数counter返回的闭包, 携带了一个游离态的 
 *          变量. 
 *      4. 由于每次调用counter都会创建独立的$counter和闭包, 因此返回的闭包相互之间是独立的. 
 *      5. 执行被返回的闭包, 对其携带的游离态变量自增并返回, 得到的就是一个计数器. 
 * 结论: 此函数可以用来生成相互独立的计数器. 
 */  
function counter() {  
    $counter = 1;  
    return function() use(&$counter) {return $counter ++;};  
}  
$counter1 = counter();  
$counter2 = counter();  
echo "counter1: " . $counter1() . "<br />/n";  
echo "counter1: " . $counter1() . "<br />/n";  
echo "counter1: " . $counter1() . "<br />/n";  
echo "counter1: " . $counter1() . "<br />/n";  
echo "counter2: " . $counter2() . "<br />/n";  
echo "counter2: " . $counter2() . "<br />/n";  
echo "counter2: " . $counter2() . "<br />/n";  
echo "counter2: " . $counter2() . "<br />/n";  
?>

Die Rolle des Abschlusses

1. Reduzieren Sie den Code der foreach-Schleife

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

Der Code lautet wie folgt:

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 verwenden Die übliche Methode, wir Das Innere wird in den HTML-

Funktionsparametern platziert, sodass es besser ist, Abschlüsse zu verwenden, unabhängig davon, ob es sich um das Lesen oder die Verwendung des Codes handelt.

3. Entsperren Sie die rekursive Funktion

Der Code lautet wie folgt:

<?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. Wenn & hier nicht verwendet wird, tritt ein Fehler auf, dass fib(n-1) die Funktion nicht finden kann (der Typ von fib wurde zuvor nicht definiert)

Ich möchte also den Abschluss verwenden, um die Schleife abzubrechen. Wenn Sie Funktionen verwenden, müssen Sie

verwenden. Der Code lautet wie folgt:

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

4. Bindung verzögern

Wenn Sie die Bindung der verwendeten Variablen verzögern müssen, müssen Sie eine Referenz verwenden, andernfalls wird beim Definieren eine Kopie erstellt zu verwenden

Der Code lautet wie folgt:

<?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)
Die Verwendung von Referenzen oder die Nichtverwendung von Referenzen bedeutet, ob beim Aufruf oder bei der Deklaration ein Wert zugewiesen werden soll.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von PHP-Verschlüssen und Beispielen für Verschlussmethoden. 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