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

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

步履不停
步履不停Original
2019-06-24 17:15:542791Durchsuche

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

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.

1

2

3

[php] view plain copy

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

}

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

Mehrere Funktionen von Abschlüssen:

1 Reduzieren Sie den Code der foreach-Schleife

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

[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('butter', 1); 

$my_cart->add('milk', 3); 

$my_cart->add('eggs', 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

2 verwenden, um die Parameter der -Funktion

1

1

2

3

4

5

6

7

8

9

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

}

23

45

1

2

3

4

5

6

7

8

9

10

[php] view plain copy

<?php

$fib =function($n)use(&amp;amp;amp;amp;$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

6<🎜><🎜>7<🎜><🎜>8<🎜><🎜>9<🎜><🎜>
< 🎜>[php] view plain copy<🎜><🎜>function html (< code>$code ,$id="", $ class=""){ <🎜><🎜>if < code>(< /code>$id !=="")$id</ code> <code >=" id = "$id"" <🎜><🎜><🎜>$class = (&amp;amp;amp;amp;lt;/ code><code >$class !=="")?" class ="$class"" :">"$open ="< ;$code$id$class"$close ="</$ code>"<code>return function ($inner ="")use ($open,$close){ return "$open$inner$close" ;}; }Wenn wir das verwenden Bei der üblichen Methode werden wir die inneren Funktionsparameter in HTML platzieren. Unabhängig davon, ob Code gelesen oder verwendet wird, ist es besser, Verschlüsse zu verwenden3, um zu entsperren rekursive Funktion
1 23 456789 10 [php] view plain copy< ?php $fib =function( code><code>$n )use(&amp;amp;amp;amp;$fib) {          if($n == 0 || $n code> <code>== 1) return 1 return $fib($n - 1) + $fib ($n - 2); code>}; echo $fib(2) ;// 2 $lie = $fib $fib =function (){die('error');}; // $fib-Variable umschreiben echo $lie(5);// Fehler, weil $fib durch Schließung referenziert wird

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

Daher möchte ich die Schließung verwenden, um sie freizugeben. Wenn Sie Funktionen in einer Schleife ausführen, müssen Sie

verwenden

1

2

3

4

5

[php] view plain copy

<?php 

$recursive =function ()use (&amp;amp;amp;amp;$recursive){ 

// The function is now available as $recursive 

}

1

2

3

4

1

2

3

4

5

6

7

8

9

10

11

12

13

[php] view plain copy

<?php 

$result = 0; 

$one =function() 

{ var_dump($result); }; 

$two =function()use ($result

{ var_dump($result); }; 

$three =function()use (&amp;amp;amp;amp;$result

{ var_dump($result); }; 

$result++; 

$one();   // outputs NULL: $result is not in scope 

$two();   // outputs int(0): $result was copied 

$three();   // outputs int(1)

5

[php] view plain copy

<?php $recursive = function ()use (&amp;amp;amp;amp;$recursive){

// Die Funktion ist jetzt als $rekursiv } verfügbar
Dieses Formular4 Informationen zur verzögerten BindungWenn Sie die Bindung der verwendeten Variablen verzögern müssen, benötigen Sie um Referenzen zu verwenden, andernfalls wird beim Definieren eine Kopie erstellt und verwendet >1234567 8910111213
[ php] view plain copy<?php $result = 0; $one =function() { var_dump($result }; zwei =function()use ($ result) { var_dump($result }; 🎜><code>$two =function()use (&amp;amp;amp;amp;amp; $result) { var_dump($result); }; $result++ $one(); // gibt NULL aus: $result ist nicht im Gültigkeitsbereich $two(); code><code>/ / gibt int(0) aus: $ergebnis wurde kopiert $drei( / / gibt int(1) aus
Referenzen zu verwenden oder nicht zu verwenden bedeutet, beim Aufrufen Werte zuzuweisen oder Werte zuzuweisen beim Deklarieren Das Obige ist die detaillierte Verwendungsmethode der PHP-Closure-Funktion () use(), die ich für Sie zusammengestellt habe. Ich hoffe, dass sie Ihnen in Zukunft hilfreich sein wird. Weitere technische Artikel zum Thema PHP finden Sie in der Spalte PHP-Tutorial, um mehr darüber zu erfahren!

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