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

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

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