Замыкания в PHP
Вопрос
Расскажите про анонимные функции и замыкания в PHP.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Анонимная функция это объект Closure
use захватывает по значению в момент создания, use (&$x) по ссылке
Стрелочные функции захватывают автоматически и только по значению
Привязка $this в методах, static function без $this
Closure::bind и bindTo для смены контекста
Применение: колбэки array_map, usort, middleware, маршруты
Что могут спросить следом
- Что будет, если изменить переменную после создания замыкания с use?
- Зачем static перед анонимной функцией?
Разбор
Анонимная функция в PHP это объект класса Closure. Внешние переменные она не видит автоматически, их перечисляют в use. Захват по значению происходит в момент создания: если потом изменить переменную, замыкание этого не увидит. Чтобы видеть изменения или менять переменную, захватывают по ссылке use (&$total).
С PHP 7.4 есть стрелочные функции fn($x) => $x * $rate: одно выражение, захват всех используемых переменных по значению автоматически. Для коротких колбэков в array_map, array_filter и usort это основной вариант.
Внутри метода класса замыкание автоматически привязывает $this. Если оно не нужно, пишут static function или static fn: так замыкание не держит объект и не продлевает ему жизнь. Контекст можно сменить через Closure::bind. Замыкания повсюду во фреймворках: маршруты, middleware, обработчики событий, фабрики в контейнере.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.