当前位置:首页 > PHP教程 > php应用 > 列表

PHP 闭包获取外部变量和global关键字声明变量的区别讲解

发布:smiling 来源: PHP粉丝网  添加日期:2021-08-22 12:41:49 浏览: 评论:0 

闭包是一个常见的概念,我们通常可以将其与回调函数配合使用,可以使代码更加简洁易读,这篇文章主要介绍了PHP 闭包获取外部变量和global关键字声明变量的区别,需要的朋友可以参考下。

最近在学习workerman的时候比较频繁的接触到回调函数,使用中经常会因为worker的使用方式不同,会用这两种不同的方式去调用外部的worker变量,这里就整理一下PHP闭包获取外部变量和global关键字声明变量的区别。

闭包

闭包是一个常见的概念,我们通常可以将其与回调函数配合使用,可以使代码更加简洁易读。

闭包可以 通过拷贝的方式 让函数使用父作用域中的变量,如:

  1. $global = 'hello'
  2. $bbb = function()use($global){ 
  3.   echo $global."\n"
  4. }; 
  5. $bbb(); 
  6. //输出 'hello' 

global关键字声明变量

通过global声明变量同样可以使函数体调用到函数外部的变量,不过global与use不同,globle关键字会使创建 一个与外部变量同名的引用 ,并且在函数内对变量作出修改同样会作用域外部变量。

  1. $global = 'hello'
  2. $fun = function(){ 
  3.   global $global
  4.   $global =' world'
  5.   echo $global."\n"
  6. }; 
  7. $fun(); 
  8. // 输出 'world' 

这里只是创建一个同名引用而已,并不会改变原本外部变量$global的作用域,也就是说在另外一个函数中调用该依旧需要声明或者使用闭包

  1. $global = 'hello'
  2. $fun = function(){ 
  3.   global $global
  4.   $global =' world'
  5.   echo 'a:'.$global."\n"
  6. }; 
  7. $ccc = function(){ 
  8.   echo 'b:'.$global
  9. }; 
  10. $fun() 
  11. $ccc() 
  12. /* 

输出

a: world

Notice: Undefined variable: global in xxxxxxx on line xx

*/

再稍微改一下代码,这样更容易对比闭包和global关键字声明变量这两种访问外部变量方式的区别。

  1. <?php 
  2. $global = 'hello'
  3. $fun = function(){ 
  4.   global $global
  5.   $global ='world'
  6.   echo 'a:'.$global."\n"
  7. }; 
  8. $bbb = function()use($global){ 
  9.   $global = 'china'
  10.   echo 'c:'.$global."\n"
  11. }; 
  12. $fun(); 
  13. echo 'b:'.$global."\n"
  14. $bbb(); 
  15. echo 'd:'.$global

这里b和d两个输出可以看出来,global改变了外部变量的值,而闭包方式并没有。

输出:

  1. a: world 
  2. b: world 
  3. c:china 
  4. d: world 

最后再贴一个官方文档中比较经典的使用匿名函数,闭包与回调函数配合的例子:

  1. class Cart 
  2.   const PRICE_BUTTER = 1.00; 
  3.   const PRICE_MILK  = 3.00; 
  4.   const PRICE_EGGS  = 6.95; 
  5.   protected  $products = array(); 
  6.   public function add($product$quantity
  7.   { 
  8.     $this->products[$product] = $quantity
  9.   } 
  10.   public function getQuantity($product
  11.   { 
  12.     return isset($this->products[$product]) ? $this->products[$product] : 
  13.       FALSE; 
  14.   } 
  15.   public function getTotal($tax
  16.   { 
  17.     $total = 0.00; 
  18.     $callback = 
  19.       function ($quantity$productuse ($tax, &$total
  20.       { 
  21.         $pricePerItem = constant(__CLASS__ . "::PRICE_" . 
  22.           strtoupper($product)); 
  23.         $total += ($pricePerItem * $quantity) * ($tax + 1.0); 
  24.       }; 
  25.     array_walk($this->products, $callback); 
  26.     return round($total, 2); 
  27.   } 
  28. $my_cart = new Cart; 
  29. $my_cart->add('butter', 1); 
  30. $my_cart->add('milk', 3); 
  31. $my_cart->add('eggs', 6); 
  32. print $my_cart->getTotal(0.05) . "\n";

Tags: PHP闭包 global

分享到: