匿名函数和引用中的 PHP 闭包 &.


php closure in anonymous function and reference &

我有:

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

我的理解:

  1. $inside = outside( 2 );,这将返回匿名函数和将其分配给变量 $inside 。匿名函数使用值为 $limit (2( 和$tally (0(。

  2. 调用函数$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:通过引用传递