Home >Backend Development >PHP Tutorial >Explanation of the difference between PHP closure obtaining external variables and global keyword declaration variables_php example

Explanation of the difference between PHP closure obtaining external variables and global keyword declaration variables_php example

韦小宝
韦小宝Original
2017-12-05 09:32:401445browse

Closure is a common concept, we can usually use it with Callback function to make the code more concise and readable. This article mainly introduces the difference between PHP Closure to obtain external variables and the global keyword to declare variables. Let us take a look at this article about PHP Closure to obtain external variables. Bar!

Recently, when I was learning Workerman, I came into contact with callback functions more frequently. During use, I often use these two different ways to call external worker variables because of the different ways of using workers. Here is a summary. PHP closure obtains the difference between external variables and variables declared with the global keyword.

Closure

Closure is a common concept. We can usually use it with callback functions to make the code more concise. Easy to read.

Closure allows functions to use variables in the parent scope through copying. For example:


$global = 'hello';
$bbb = function()use($global){
  echo $global."\n";
};
$bbb();
//输出 'hello'


global keyword declares variables

Declaring variables through global can also make the function body call variables outside the function, but global is different from use. The global keyword will create a reference with the same name as the external variable, and modify the variable within the function. External variables will also be scoped.


$global = 'hello';
$fun = function(){
  global $global;
  $global =' world';
  echo $global."\n";
};
$fun();
// 输出 'world'


This just creates a reference with the same name and does not change the scope of the original external variable $global, that is to say, in Calling this from another function still requires declaring or using a closure


$global = 'hello';
$fun = function(){
  global $global;
  $global =' world';
  echo 'a:'.$global."\n";
};
$ccc = function(){
  echo 'b:'.$global;
};
$fun()
$ccc()
/*


Output


a: world
Notice: Undefined variable: global in xxxxxxx on line xx
*/


Change the code slightly so that it is easier to compare the differences between closures and global keyword declarations of variables, which are two ways of accessing external variables.


<?php
$global = &#39;hello&#39;;
$fun = function(){
  global $global;
  $global =&#39;world&#39;;
  echo &#39;a:&#39;.$global."\n";
};
$bbb = function()use($global){
  $global = &#39;china&#39;;
  echo &#39;c:&#39;.$global."\n";
};
$fun();
echo &#39;b:&#39;.$global."\n";
$bbb();
echo &#39;d:&#39;.$global;


It can be seen from the two outputs b and d that global changes the value of the external variable, but the closure method does not .

Output:


a: world
b: world
c:china
d: world


Finally, I will post a more classic use in the official documentAnonymous function, Example of cooperation between closure and callback function:


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);
print $my_cart->getTotal(0.05) . "\n";


Summary

The above is the editor’s introduction to the difference between PHP closures to obtain external variables and the global keyword to declare variables. I hope it will be helpful to you. If you have any questions, you can contact us in the community of this site. Ask questions in the Q&A!

Related recommendations:

Instructions on the practical application of PHP closure features

What is php closure? Detailed explanation of closure usage examples

php closure syntax study one

The above is the detailed content of Explanation of the difference between PHP closure obtaining external variables and global keyword declaration variables_php example. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn