Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Abschluss (Closure), ausführliche Erläuterung anonymer Funktionsbeispiele

PHP-Abschluss (Closure), ausführliche Erläuterung anonymer Funktionsbeispiele

怪我咯
怪我咯Original
2017-06-28 11:25:22993Durchsuche

Dieser Artikel stellt Ihnen hauptsächlich die in PHP5.3 eingeführte anonyme Funktion vor, nämlich die Schließung (Closure), und ich empfehle sie 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, das Aufmerksamkeit erfordert, 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:

Der Code 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);

Ergebnis Dies ist ein Abschluss-Use-String-Wert, die Nachricht lautet: Hallo, alle df250b2156c434f3390392d09b1c9563/n

In der neuen Open-Closure-Syntax von PHP verwenden wir use to use die Schließung externer Definition von Variablen. 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 als Wert übergeben werden, wird der Wert der Verschlussverwendung beim Erstellen des Verschlusses bestimmt.

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 Funktion des Verschlusses

1. Reduzieren Sie den foreach-Schleifencode
Zum Beispiel der Beispiel-Cart

-Code im Handbuch http://php.net/manual/ en/functions.anonymous.php Wie folgt:

<?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 Code gelesen oder verwendet wird.

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

, also müssen Sie dies tun Verwenden Sie

, wenn Sie einen Abschluss verwenden möchten, um die Schleifenfunktion abzubrechen.

Der Code lautet wie folgt:

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

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 in Gebrauch

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 von

ein Wert zugewiesen werden soll

Das obige ist der detaillierte Inhalt vonPHP-Abschluss (Closure), ausführliche Erläuterung anonymer Funktionsbeispiele. 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