我有:
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
的价值吗?
任何对官方文档的引用都会有所帮助!
匿名函数实际上是 php 中的Closure
对象。如果将var_dump($invoke)
添加到代码中,您将看到以下内容:
object(Closure)#1 (1) {
["static"]=>
array(2) {
["limit"]=>
int(2)
["tally"]=>
int(0)
}
}
use
'd 变量存储在闭包对象的 static
数组中。当您调用闭包时,这些变量将传递给函数,就像普通参数一样。因此,如果不使用引用,它们将通过复制传递,并且在函数中对它们的任何更改都将不起作用。
&
表示通过引用而不是值传递参数。这意味着您可以在函数内更改变量,并且它将在函数外部被记住 - 而不仅仅是在该函数中。
通过将函数分配给$inside
,您可以有效地保持对变量的引用不变,因此每次调用都会记住它。
请参阅 PHP:通过引用传递