Введение в анонимные функции

Обычно при определении функции вы указываете ей имя, чтобы затем вызывать её по этому имени. Например, функция для умножения двух чисел:
Функция multiply() принимает два аргумента и возвращает результат. Вызвать её можно так:
Это именованная функция, которую можно использовать многократно.
PHP также позволяет создавать анонимные функции, то есть функции без имени:
Так как у функции нет имени, её определение заканчивается точкой с запятой, ведь для PHP это выражение. Сама по себе такая функция бесполезна, чтобы её использовать, нужно присвоить её переменной:
Вызов осуществляется через переменную:
Если вывести информацию о переменной $multiply, вы увидите объект типа Closure:
Вывод:
Важно: в PHP Closure - не то же самое, что замыкания в других языках (например, JavaScript или Python).
Анонимная функция - это объект: её можно присваивать переменным, передавать в другие функции или возвращать из функций.

Передача анонимной функции в другую функцию

Многие встроенные функции PHP принимают колбэк-функции. Например, array_map():
Этот пример работает, но может быть избыточным, если функция используется только один раз. С анонимной функцией всё короче:

Область видимости анонимной функции

По умолчанию анонимная функция не имеет доступа к переменным родительской области видимости:
PHP выдаст ошибку о неопределённой переменной. Чтобы использовать внешнюю переменную, используйте конструкцию use:
Переменные передаются по значению. Изменения внутри функции не отражаются снаружи:
Вывод:
Для передачи по ссылке используйте &:
Вывод:

Возврат анонимной функции из функции

Можно возвращать анонимную функцию из другой функции:
Функция multiplier() возвращает новую функцию, которая умножает аргумент на заданное число.

Итог

  • Анонимная функция - это функция без имени.
  • В PHP анонимная функция является объектом типа Closure.
  • Для доступа к переменным родительской области используйте конструкцию use.
  • Анонимные функции можно присваивать переменным, передавать в другие функции и возвращать из функций.