Использует ли ключевое слово use в закрытии PHP по ссылке?

Например, если я это сделаю:

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

$my_var = 0;
bar($my_var);

Будет ли изменен параметр $my_var? Если нет, как мне заставить это работать без добавления параметра в $foo?

Ответ 1

Нет, они не передаются по ссылке - use следует аналогичной нотации, такой как параметры функции. Вы можете проверить это самостоятельно с помощью функции debug_zval_dump (Demo):

<?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;

Вывод:

long(0) refcount(3)
0

Ссылка на полный доступ к всем областям будет иметь коэффициент пересчета в 1. Как написано, вы достигаете этого, определяя использование в качестве сквозной ссылки:

    $foo = function() use (&$var)

Также можно создать рекурсию таким образом:

$func = NULL;
$func = function () use (&$func) {
    $func();
}

Ответ 2

Закрытие, по определению, закрывается по значению, а не по ссылке. Вы можете "использовать по ссылке", добавив в список аргументов &:

function() use (&$var)

Это можно увидеть в примере 3 на странице руководства анонимных функций.

Ответ 3

Нет, они не передаются по ссылке.

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

$my_var = 0;
foo($my_var);
echo $my_var; // displays 0

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

$my_var = 0;
bar($my_var);
echo $my_var; // displays 1