Сколько раз вы работали с инструментами, которые не разрабатывали? Трудно сосчитать не так ли? Иногда, используя PHP-библиотеки, которые очень сложны и в то же время не соответствуют всем вашим требованиям, у вас могут возникнуть проблемы при попытке удовлетворить эти требования. Замыкание — это отдельное пространство имен, где обычно вы не можете получить доступ к переменным, определенным вне этого пространства имен. Вот где появляется ключевое слово use, которое делает переменную вне области действия доступной внутри замыкания, например:
1,
"b" => 2
);
$returnedValue = some_function_that_expect_closures(function() use ($variableOutside){
// array(2) { ["a"]=> int(1) ["b"]=> int(2) }
var_dump($variableOutside);
return "Hello World";
});
// string(11) "Hello World"
var_dump($returnedValue);
Одна из наиболее распространенных проблем с библиотеками, которые используют замыкания, заключается в том, что начинающие разработчики не могут обновить значение переменной вне области закрытия PHP, например:
Цель предыдущего фрагмента - просто изменить значение $myVariable
через функцию обратного вызова (замыкание). Новичок в PHP будет просто думать, что значение $myVariable
сейчас "сыр", однако это не из-за способа, которым закрытие работает.
Изменение значения переменной в закрытии
Так что, как это ни звучит, вы можете изменить значение переменной вне замыкания, передав ее в качестве ссылки, а не копии (делая переменную доступной внутри замыкания), добавляя &
к переменной в операторе использования. Как показано в официальной документации PHP, синтаксис для передачи переменной по ссылке следующий:
Таким образом, в нашем примере внутри замыканий вы можете просто обновить значение внешней переменной, сделав его доступным внутри области действия с использованием, и передав его по ссылке, предварительно добавив &
к переменной:
Обратите внимание, что вы можете назначить любое значение (не только скалярные значения) без проблем в замыкании.