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 = '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 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('butter', 1); $my_cart->add('milk', 3); $my_cart->add('eggs', 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!