Переменные PHP в анонимных функциях

119

Я играл с анонимными функциями в PHP и понял, что они, похоже, не достигают переменных вне их. Есть ли способ обойти эту проблему?

Пример:

$variable = "nothing";

functionName($someArgument, function() {
  $variable = "something";
});

echo $variable;  //output: "nothing"

Это выведет «ничего». Есть ли способ, которым анонимная функция может получить доступ к $variable?

einord
источник

Ответы:

277

Да, используйте закрытие :

functionName($someArgument, function() use(&$variable) {
  $variable = "something";
});

Обратите внимание, что для того, чтобы вы могли изменять $variableи извлекать измененное значение за пределами области действия анонимной функции, на него необходимо ссылаться в закрытии с помощью &.

nickb
источник
Это новое! Это новый синтаксис в PHP 5.3.
Rocket Hazmat
1
@Rocket Итак, честно говоря, это настоящий синтаксис анонимной функции (в отличие от create_function()), и useключевое слово задокументировано (плохо) на той же странице документа, которая их описывает.
DaveRandom
4
Небольшое примечание для тех, кто может не знать: вы можете опустить &при передаче объекта, так как они всегда передаются по ссылке ... и не забывайте свой тип-подсказку :) Например:function() use (PDO $pdo) {
keyboardSmasher
@Alliswell Нет, это только для объектов, иначе вам нужно передать по ссылке, чтобы изменить переменную. См. Этот пример .
nickb 06