Как изменить значение переменной вне области видимости в функции замыкания в PHP

Сколько раз вы работали с инструментами, которые не разрабатывали? Трудно сосчитать не так ли? Иногда, используя 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, синтаксис для передачи переменной по ссылке следующий:

Таким образом, в нашем примере внутри замыканий вы можете просто обновить значение внешней переменной, сделав его доступным внутри области действия с использованием, и передав его по ссылке, предварительно добавив & к переменной:

Обратите внимание, что вы можете назначить любое значение (не только скалярные значения) без проблем в замыкании.

Ссылка на основную публикацию
Adblock
detector