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

时间:2014-10-07 01:59:51

标签: php closures anonymous-function

我有:

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的价值?

  3. 任何对官方文档的引用都会有所帮助!

2 个答案:

答案 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,您实际上保持对变量的引用不变,因此它将从调用到被调用时被记住。

请参阅PHP: Passing by Reference