Например, если я это сделаю:
function bar(&$var) { $foo = function() use ($var) { $var++; }; $foo(); } $my_var = 0; bar($my_var);
Будет ли изменен параметр $my_var
? Если нет, как мне заставить это работать без добавления параметра в $foo
?
Нет, они не передаются по ссылке – 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(); }
Закрытие, по определению, закрывается по значению, а не по ссылке. Вы можете «использовать по ссылке», добавив в список аргументов &
:
function() use (&$var)
Это можно увидеть в примере 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