PHP闭包中的use关键字是否通过引用传递?

eli*_*472 37 php functional-programming function

例如,如果我这样做:

function bar(&$var)
{
    $foo = function() use ($var)
    {
        $var++;
    };
    $foo();
}

$my_var = 0;
bar($my_var);
Run Code Online (Sandbox Code Playgroud)

$my_var被修改吗?如果没有,如何在不添加参数的情况下使其工作$foo

hak*_*kre 58

不,它们不是通过引用传递的 - use下面是类似函数参数的表示法.您可以在debug_zval_dump函数(演示)的帮助下自行验证:

<?php
header('Content-Type: text/plain;');

function bar(&$var)
{
    $foo = function() use ($var)
    {
        debug_zval_dump($var);
        $var++;
    };
    $foo();
};

$my_var = 0;
bar($my_var);
echo $my_var;
Run Code Online (Sandbox Code Playgroud)

输出:

long(0) refcount(3)
0
Run Code Online (Sandbox Code Playgroud)

完全通过所有范围的工作引用的引用计数为1.正如所写的那样,您可以通过将引用定义为pass-by-reference来实现:

    $foo = function() use (&$var)
Run Code Online (Sandbox Code Playgroud)

也可以这样创建递归:

$func = NULL;
$func = function () use (&$func) {
    $func();
}
Run Code Online (Sandbox Code Playgroud)

  • 比一年晚好一年! (6认同)

Emi*_*röm 18

几乎按照定义,闭包是按价值而不是按参考结算.您可以通过&在参数列表中添加一个来"通过引用使用" :

function() use (&$var)
Run Code Online (Sandbox Code Playgroud)

这可以在匿名函数手册页的示例3中看到.