Home > Article > Backend Development > Explanation of the difference between PHP closure to obtain external variables and global keyword to declare variables
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'
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'
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() /*
Output
a: world Notice: Undefined variable: global in xxxxxxx on line xx */
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 = 'hello'; $fun = function(){ global $global; $global ='world'; echo 'a:'.$global."\n"; }; $bbb = function()use($global){ $global = 'china'; echo 'c:'.$global."\n"; }; $fun(); echo 'b:'.$global."\n"; $bbb(); echo 'd:'.$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 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('butter', 1); $my_cart->add('milk', 3); $my_cart->add('eggs', 6); print $my_cart->getTotal(0.05) . "\n";
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!
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!