Что такое анонимная функция
Что проверяют
Понимаете ли вы, что в PHP замыкание не подхватывает окружение само, и когда именно фиксируется значение захваченной переменной. Вопрос звучит как просьба дать определение, а проверяет аккуратность работы с областями видимости.
Как отвечать
Анонимная функция это функция без имени, объект класса Closure. Её можно присвоить переменной, передать аргументом и вернуть из другой функции.
Ключевое отличие от привычного по многим языкам поведения: внешние переменные надо перечислить явно в use, и захват идёт по значению в момент создания функции.
$rate = 2;
$mul = function (int $n) use ($rate): int {
return $n * $rate;
};
$rate = 10;
echo $mul(5);Здесь на выходе будет десять, а не пятьдесят: значение скопировалось при объявлении. Захват по ссылке пишут как use (&$rate).
Дальше стоит назвать стрелочные функции вида fn ($n) => $n * $rate. Они состоят из одного выражения и захватывают внешние переменные автоматически, всегда по значению.
Полезные детали для сильного ответа: замыкание, созданное внутри класса, привязано к $this и видит закрытые свойства, а перепривязать его можно через bindTo или Closure::bind; слово static перед function эту привязку отключает; из существующей функции или метода замыкание удобно получать синтаксисом первого класса.
Где спотыкаются
Ждут, что переменная подхватится сама, как в языках с лексическим захватом, и получают предупреждение о неопределённой переменной либо пустое значение. Без use внешнего окружения внутри нет.
Меняют переменную после объявления функции и удивляются старому значению. Особенно заметно в цикле, где замыкания складывают в массив: при захвате по значению каждое запоминает свою итерацию, при захвате по ссылке все увидят последнее значение.
Складывают замыкания туда, где нужна сериализация: в сессию, в кэш, в тело задачи для очереди. Объект замыкания не сериализуется, и выясняется это уже в работающем приложении.