Heim  >  Artikel  >  Backend-Entwicklung  >  Diagramm der anonymen PHP-Abschlussfunktion

Diagramm der anonymen PHP-Abschlussfunktion

墨辰丷
墨辰丷Original
2018-06-13 11:01:521863Durchsuche

Dieser Artikel stellt Ihnen hauptsächlich die in PHP5.3 eingeführte anonyme PHP-Funktion vor, nämlich den Verschluss (Closure), und die Rolle des Verschlusses. Er ist sehr detailliert und wird hier Freunden in Not empfohlen.

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 String-Wert für die Verwendung eines Abschlusses. Die Nachricht lautet: Hallo, Jeder.

In der neuen Open-Closure-Syntax von PHP verwenden wir use, um Variablen zu verwenden, die außerhalb des Closings definiert sind. 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. Bei grundlegenden Typparametern, die als Wert übergeben werden, wird der Wert der Verschlussverwendung beim Erstellen des Verschlusses bestimmt.

Die kleine Anwendung 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 Zum Beispiel lautet das Handbuch http Der Beispiel-Cart

-Code in ://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
?>

Hier transformieren wir getTotal Funktion müssen wir foreach verwenden.

2. Funktionsparameter reduzieren

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 die übliche Methode verwenden, werden wir inner in den HTML-Code einfügen Funktionsparameter. Unabhängig davon, ob es sich um das Lesen oder Verwenden von Code handelt, ist es besser, Abschlüsse zu verwenden.

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

Wenn Sie also den Abschluss verwenden möchten, um die Schleifenfunktion abzubrechen, müssen Sie dies tun Verwenden Sie

Der Code lautet wie folgt:

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

Dieses 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 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 Zuweisung beim Aufrufen oder Zuweisen bei der Deklaration

Zusammenfassung: Die Oben finden Sie den gesamten Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein.

Verwandte Empfehlungen:

MySQL-Operationspuffermethode in PHP

Definition und Verwendung der Mail-Funktion in PHP

Definition und Verwendung der Mail-Funktion in PHP

Das obige ist der detaillierte Inhalt vonDiagramm der anonymen PHP-Abschlussfunktion. 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