PHP: Функции
Теория: Объекты первого класса
В языках программирования существует понятие объекты первого рода. Так обозначают элементы, которые можно передать в функции, вернуть из функций и присвоить переменным. К таким элементам относятся числа, строки, массивы, логические значения или любые другие данные.
Переменная под это понятие не попадает. Объектом первого рода считаются те данные, которые лежат в переменной:
Описанное выше вы проделывали множество раз, но есть одно «но». Функции тоже могут быть объектами первого рода:
Запустите код выше. Он работает! Давайте разбираться.
Мы привыкли к такому определению функций:
У функции есть имя, которое указывается после ключевого слова function, а сама конструкция является инструкцией. Кстати, поэтому в конце нет точки с запятой. Мы не можем написать так:
Определение функции — это инструкция, поэтому оно не может подставляться в те места, где ожидаются выражения. Присваивание как раз подразумевает, что в правой части находится именно выражение. Соответственно, такой код падает с ошибкой, а вот следующий код уже работает:
Даже не вникая в синтаксис, можно сделать вывод, что конструкция справа от знака «равно» — это выражение, и оно порождает функцию. В PHP подобные функции называют анонимными, потому что у них нет имени. Глядя на код выше, нужно понимать, что определение функции и ее присваивание переменной — две разных операции. Чистое определение выглядит так:
Очень похоже на обычную функцию, за исключением отсутствия имени. Правда, есть еще и стилевые отличия, закрепленные стандартом PSR-12. В других языках анонимные функции нередко называют лямбда-функциями. В принципе, и в PHP их иногда зовут так же:
Имя переменной можно выбирать произвольно, в этом смысле анонимные функции никак не влияют на ситуацию. Созданные именованные функции никуда не исчезают в процессе жизни программы. В отличие от них, анонимные функции постоянно создаются и пропадают вместе с переменными, в которые они записаны. Другими словами, анонимные функции всегда локальны относительно контекста и доступны там, где они были созданы, если не предпринимать специальных мер по их возврату.
Подобно именованным, анонимные функции могут принимать аргументы. В этом отношении поведение абсолютно идентично. Все, что мы изучали до этого момента для именованных функций, работает и для анонимных:
Анонимная функция — это выражение, поэтому мы можем определять ее в любом месте программы, допускающем использование выражений — например, в теле другой функции:
Главное в коде выше — не забыть поставить return и помнить, что $a и $b снаружи анонимной функции не связаны с переменными, имеющими те же имена внутри анонимной функции.
В вашей голове может возникнуть вопрос «Зачем все это?». Все же анонимные функции появились в PHP не сразу. Их использование значительно повышает выразительные возможности языка, и в этом вы скоро убедитесь. Если же взять JavaScript, то там анонимные функции составляют костяк любой программы. Функции, создающие функции, возвращающие функции и принимающие функции как аргументы — это основной способ разрабатывать в JavaScript.
Стрелочные функции
Начиная с версии 7.4, в PHP появились стрелочные функции. Это те же анонимные функции, но с компактным синтаксисом. Они удобны в тех ситуациях, где тело функции занимает одну строку:
Стрелочные функции появились в языке не просто так. Использование обычных анонимных функций всегда приводило к раздуванию кода из-за объемного синтаксиса. Теперь эта проблема практически уходит. Стрелочные функции достаточно компактны, и в дальнейших курсах применяются очень широко.
Передача обычных и анонимных функций
Обычные функции в PHP не являются объектами первого рода. Несмотря на это, PHP может имитировать соответствующее поведение с помощью строк. Достаточно записать имя функции в переменную и вызвать ее:
Точно так же можно передать функцию в функцию:
.png)
