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.