Ответ вслух Junior Функции, замыкания, генераторы обновлено

Замыкания в PHP

Вопрос

Расскажите про анонимные функции и замыкания в PHP.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Анонимная функция в PHP это объект класса Closure. Внешние переменные она не видит автоматически, их перечисляют в use.

Что должно прозвучать в ответе

  • Анонимная функция это объект 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 ошибок.