Maison >développement back-end >tutoriel php >Méthodes d'utilisation détaillées dans la fonction de fermeture PHP() use()

Méthodes d'utilisation détaillées dans la fonction de fermeture PHP() use()

步履不停
步履不停original
2019-06-24 17:15:542836parcourir

Méthodes d'utilisation détaillées dans la fonction de fermeture PHP() use()

La fermeture de PHP (Closure) est également une fonction anonyme. Il a été introduit dans PHP5.3.

La syntaxe de la fermeture est très simple. Le seul mot-clé qui nécessite une attention particulière est use Utiliser des moyens pour connecter la fermeture et les variables externes.

1

2

3

[php] view plain copy

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

}

123
[php] voir en clair copie$a =fonction()utiliser($b) { }

Plusieurs fonctions de fermetures :

1 Réduire le code de la boucle foreach

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 

?>

Ici si on transforme la fonction getTotal, il faut utiliser foreach

2 pour réduire les paramètres de la fonction

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

}

1

2

3

4

5

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] afficher en clair copier<🎜><🎜>fonction html (< code>$code ,$id="", $ class=""){ <🎜><🎜>if < code>(< /code>$id !=="")$id</ code> <code >=" id = "$id"" <🎜><🎜><🎜>$class = (&amp;amp;amp;amp;lt;/ code><code >$class !=="")?" classe ="$class""  :">"$open ="< ;$code$id$class"$close ="</$ code>"<code>retour fonction ($inner ="")utiliser ($open,$close){ retour "$open$inner$close" ;}; }Si nous utilisons le méthode habituelle, nous L'intérieur sera placé dans les paramètres de la fonction html, donc qu'il s'agisse de lire ou d'utiliser le code, il est préférable d'utiliser des fermetures3 pour débloquer le fonction récursive
1 23 456789 10 [php] voir brut copie< ?php $fib =fonction( code><code>$n )utiliser(&amp;amp;amp;amp;$fib) {          if($n == 0 || $n code> <code>== 1) retour 1 retour $fib($n - 1) + $fib ($n - 2) ; }; echo $fib(2) ;// 2 $lie = $fib $fib =fonction (){die('erreur');}; //réécrire la variable $fib echo $lie(5);// erreur car $fib est référencé par fermeture

Notez que l'utilisation dans la question ci-dessus utilise &. Si & n'est pas utilisé ici, une erreur se produira n-1) La fonction est introuvable (le type de fib n'a pas été défini précédemment)

Je veux donc utiliser la fermeture pour le libérer. Lors de la boucle de fonctions, vous devez utiliser

.

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] voir simple copie

<?php $récursif = fonction ()utiliser (&amp;amp;amp;amp;$récursif){

// La fonction est désormais disponible en $récursif }
Ce formulaire4 À propos de la liaison retardéeSi vous devez retarder la liaison des variables utilisées, vous devez utiliser des références, sinon lors de la définition Une copie sera faite et mise en service
1234567 8910111213 [ php] voir brut copie<?php $result = 0; $one =fonction() { var_dump($result }; $); deux =fonction()utiliser ($ résultat) { var_dump($result }; $trois =fonction()utiliser (&amp;amp;amp;amp;amp; $result) { var_dump($result); }; <code>$result++; $un(); // renvoie NULL : $result n'est pas dans la portée $two(); code><code>/ / sorties int(0) : $result a été copié $trois( /); /outputs int(1)
Utiliser des références ou ne pas utiliser de références signifie attribuer des valeurs lors de l'appel ou de l'attribution de valeurs lors de la déclaration Ce qui précède est la méthode d'utilisation détaillée de la fonction de fermeture PHP() use() que j'ai compilée pour vous. J'espère qu'elle vous sera utile à l'avenir. Pour plus d'articles techniques liés à PHP, veuillez visiter la colonne Tutoriel PHP pour apprendre !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn