Home > Backend Development > PHP Tutorial > Explanation of the difference between PHP closure to obtain external variables and global keyword to declare variables

Explanation of the difference between PHP closure to obtain external variables and global keyword to declare variables

jacklove
Release: 2023-04-02 21:06:01
Original
2353 people have browsed it

Closure is a common concept, and we can usually use it with callback functions 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. Friends who need it can refer to it

Recently, when I was learning Workerman, I came into contact with callback functions more frequently. I often use them. Because workers are used in different ways, these two different methods will be used to call external worker variables. Here we will sort out the differences between PHP closures to obtain external variables and the global keyword to declare variables.

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'
Copy after login

global keyword declaration of variables

You can also declare variables through global Make the function body call a variable 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 modifications to the variable within the function will also scope the external variable.

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

This just creates a reference with the same name and does not change the scope of the original external variable $global, which means calling it in another function You still need to declare or use a closure

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

Output

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

Change it a little bit code, so that it is easier to compare the differences between closures and global keyword declarations of variables, 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;
Copy after login

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
Copy after login

Finally, I will post a more classic example of using anonymous functions, closures and callback functions in the official documents:

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";
Copy after login

Summary

The above is the PHP closure introduced by the editor to you The difference between package acquisition of external variables and variables declared with the global keyword is explained. I hope it will be helpful to everyone. If you have any questions, please leave me a message and the editor will reply to you in time. I would also like to thank you all for your support of the php Chinese website!

Articles you may be interested in:

Detailed explanation of how to use anyproxy to improve the efficiency of public account article collection

Explanation on how to collect WeChat public account article pages using PHP

Detailed explanation on how to collect WeChat public account historical message pages

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

source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template