PHP's Closure (Closure) is also an anonymous function. was introduced by PHP5.3.
The syntax of a closure is simple, and the key word to be aware of is that only use,use means connecting closures and external variables.
| 123 |
$a= function() use($b) {} |
Several functions of closures: 1 reducing the Loop code for foreach
such as the example cart in the handbook http://php.net/manual/en/functions.anonymous.php
| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
<?php// 一个基本的购物车,包括一些已经添加的商品和每种商品的数量。// 其中有一个方法用来计算购物车中所有商品的总价格。该方法使用了一个closure作为回调函数。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);// 打出出总价格,其中有 5% 的销售税.print $my_cart->getTotal(0.05) . "\n";// The result is 54.29?> |
Here, if we transform the Gettotal function, we must use the foreach
2 Reducing the parameters of a function
| 12345678910111213141516 |
function html ($code , $id="", $class=""){if ($id !== "") $id = " id = \"$id\"" ;$class = ($class !== "")? " class =\"$class\"":">";$open = "<$code$id$class";$close = "</$code>";return function ($inner = "") use ($open, $close){return "$open$inner$close";};}如果是使用平时的方法,我们会把inner放到html函数参数中,这样不管是代码阅读还是使用都不如使用闭包 |
3 Lifting the recursive function
| 12345678910 |
<?php $fib = function($n) use(&$fib) { if($n == 0 || $n == 1) return 1; return $fib($n - 1) + $fib($n - 2); }; echo $fib(2) . "\n"; // 2 $lie = $fib; $fib = function(){die(‘error‘);};//rewrite $fib variable echo $lie(5); // error because $fib is referenced by closure |
Note that the use of the & in the above title is not used & error will occurFIb(
n-1) is unable to find function (the type of FIB is not previously defined)
So when you want to use closures to remove the loop function, you need to use the
| 1234 |
<?php$recursive= function () use(&$recursive){// The function is now available as $recursive} |
Such a form
4 About delay binding
If you need to delay the binding of a variable inside a use, you need a reference, or you will make a copy of it when you define it.
| 1234567891011121314151617 |
<?php$result = 0; $one = function(){ var_dump($result); };$two = function() use ($result){ var_dump($result); }; $three = function() use (&$result){ var_dump($result); };$result++;$one(); // outputs NULL: $result is not in scope$two(); // outputs int(0): $result was copied$three(); // outputs int(1) |
The use of references and non-use of references represents the assignment of a call, or the assignment of a value at the time of declaration
PHP's Closure (Closure) is also an anonymous function. was introduced by PHP5.3.