我有:
function outside( $limit ) {
$tally = 0;
return function() use ( $limit, &$tally ) {
$tally++;
if( $tally > $limit ) {
echo "limit has been exceeded";
}
};
}
$inside = outside( 2 );
$inside();
$inside();
$inside();
输出:limit has been exceeded
我的理解:
在$inside = outside( 2 );
上,这将返回匿名函数和
将其分配给变量$inside
。匿名函数使用
值$limit
(2)和$tally
(0)。
调用函数$inside()
。这会将$tally
增加到1
价值以某种方式被记住,$limit
也是如此。什么目的
$tally
之前的&符号?我知道它曾用于创造
引用,但在这种情况下,它让我困惑。怎么能关闭
记住$limit
的价值?
任何对官方文档的引用都会有所帮助!
答案 0 :(得分:6)
匿名函数实际上是php中的Closure
个对象。如果您在代码中添加var_dump($invoke)
,则会看到:
object(Closure)#1 (1) {
["static"]=>
array(2) {
["limit"]=>
int(2)
["tally"]=>
int(0)
}
}
use
' d变量存储在闭包对象的static
数组中。当您调用闭包时,这些变量将传递给函数,就像普通参数一样。因此,如果您不使用引用,它们将通过复制传递,并且对函数中的任何更改都将无效。
答案 1 :(得分:3)
&
表示您通过引用传递参数而不是值。这意味着您可以更改函数内部的变量,它将被记住在外部 - 而不仅仅是在该函数中。
通过将函数分配给$inside
,您实际上保持对变量的引用不变,因此它将从调用到被调用时被记住。