Использует ли ключевое слово 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