How to use closures to obtain external variables in PHP

php中世界最好的语言
Release: 2023-03-18 06:44:01
Original
3568 people have browsed it

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


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

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()
/*
Copy after login

Output

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

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


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!

Related labels:
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
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!