温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

PHP闭包function() use()中的使用方法

发布时间:2020-10-12 15:44:20 来源:亿速云 阅读:241 作者:小新 栏目:编程语言

这篇文章主要介绍了PHP闭包function() use()中的使用方法,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。

php的闭包(Closure)也就是匿名函数。是PHP5.3引入的。

闭包的语法很简单,需要注意的关键字就只有use,use意思是连接闭包和外界变量。

1

2

3

[php] view plain copy

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

}

闭包的几个作用:

1 减少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  

?>

这里如果我们改造getTotal函数必然要使用到foreach

2 减少函数的参数

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

}

如果是使用平时的方法,我们会把inner放到html函数参数中,这样不管是代码阅读还是使用都不如使用闭包

3 解除递归函数

1

2

3

4

5

6

7

8

9

10

[php] view plain copy

<?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('error');};//rewrite $fib variable  

  echo $lie(5);// error   because $fib is referenced by closure

注意上题中的use使用了&,这里不使用&会出现错误n-1)是找不到function的(前面没有定义fib的类型)

所以想使用闭包解除循环函数的时候就需要使用

1

2

3

4

5

[php] view plain copy

<?php  

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

// The function is now available as $recursive  

}

这样的形式

4 关于延迟绑定

如果你需要延迟绑定use里面的变量,你就需要使用引用,否则在定义的时候就会做一份拷贝放到use中

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 (&$result)  

{ var_dump($result); };  

$result++;  

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

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

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

使用引用和不使用引用就代表了是调用时赋值,还是申明时候赋值

感谢你能够认真阅读完这篇文章,希望小编分享PHP闭包function() use()中的使用方法内容对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,遇到问题就找亿速云,详细的解决方法等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI