Home  >  Article  >  Backend Development  >  How to use closures to obtain external variables in PHP

How to use closures to obtain external variables in PHP

php中世界最好的语言
php中世界最好的语言Original
2017-12-20 13:52:583565browse

Recently, when I was working as a workerman, I came into contact with callback functions very frequently. Today I will sort out the differences between PHP's must-have packages 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 and readable.

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 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'

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, calling it in another function still requires a declaration or use of 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 to access 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 of anonymous function, closure and callback function in the official document Example:


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


I believe you have mastered the method after reading these cases. For more exciting information, please pay attention to other related articles on the PHP Chinese website !

Related reading:

Detailed example of ajax implementation of uploading files without refreshing

Using jQuery+Ajax in PHP to implement paging Query function

AJAX implementation of simple registration page asynchronous request example code

The above is the detailed content of How to use closures to obtain external variables in PHP. 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