Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
匿名函数和引用中的php闭包&;_Php_Closures_Anonymous Function - Fatal编程技术网

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

匿名函数和引用中的php闭包&;,php,closures,anonymous-function,Php,Closures,Anonymous Function,我有: 输出:已超出限制 我的理解是: on$inside=外部(2)这将返回匿名函数和 将其分配给变量$inside。匿名函数使用 $limit(2)和$tally(0)的值 调用函数$inside()。这会将$tally增加到1 值以某种方式被记住,$limit。目的何在 在$tally之前的符号的长度?我知道这是用来创造的 但在这种情况下,我感到困惑。这怎么可能结束呢 还记得$limit的值吗 任何参考官方文件都会有帮助 The&表示通过引用而不是值传递参数。这意味着您可以在函数内部更改变

我有:

输出:
已超出限制

我的理解是:

  • on
    $inside=外部(2)
    这将返回匿名函数和 将其分配给变量
    $inside
    。匿名函数使用
    $limit
    (2)和
    $tally
    (0)的值

  • 调用函数
    $inside()
    。这会将
    $tally
    增加到
    1
    值以某种方式被记住,
    $limit
    。目的何在 在<代码>$tally之前的符号的长度?我知道这是用来创造的 但在这种情况下,我感到困惑。这怎么可能结束呢 还记得
    $limit
    的值吗


  • 任何参考官方文件都会有帮助

    The
    &
    表示通过引用而不是值传递参数。这意味着您可以在函数内部更改变量,它将在函数外部被记住,而不仅仅是在该函数中

    通过将函数分配给
    $inside
    ,您可以有效地保持对变量的引用完整,因此它将在调用之间被记住


    请参见

    匿名函数实际上是php中的
    Closure
    对象。如果将
    var\u dump($invoke)
    添加到代码中,您将看到:

    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();
    

    use
    'd变量存储在closure对象的
    static
    数组中。调用闭包时,这些变量将传递给函数,就像普通参数一样。因此,如果不使用引用,它们将通过复制来传递,函数中对它们的任何更改都不会产生任何影响。

    现在有一些有趣的代码!有一段时间没看到那些东西了。我真的抗议这个问题是重复的。虽然非常相似,但这个问题更多地关注通过引用传递的变量,而不是
    use
    关键字本身的用法。我认为在函数中,关键字“static”用于“记住”目的,而不是用于记住的符号是的,这会起作用,但是
    &
    意味着您可以从函数外部传递变量,例如对对象的引用或全局值(每次都不是同一个变量),即必须将其设置为函数外部的变量。您也可以按值传递变量(无
    &
    )然后从函数返回该值并将其设置为同一变量。这在功能上是一样的。但是,如果您需要一个函数来更改两个变量(例如),那么这将变得更加复杂。$limit的值在未声明为引用的情况下如何在后续调用中保持不变?哦,好吧,既然它是闭包对象的静态属性,那么该值在后续调用中保持不变?我想我现在更了解品牌了。
    object(Closure)#1 (1) {
      ["static"]=>
      array(2) {
        ["limit"]=>
        int(2)
        ["tally"]=>
        int(0)
      }
    }