0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В языках программирования существует понятие<strong>объекты первого рода</strong>. Так обозначают элементы, которые можно передать в функции, вернуть из функций и присвоить переменным. К таким элементам относятся числа, строки, массивы, логические значения или любые другие данные.</p>
1
<p>В языках программирования существует понятие<strong>объекты первого рода</strong>. Так обозначают элементы, которые можно передать в функции, вернуть из функций и присвоить переменным. К таким элементам относятся числа, строки, массивы, логические значения или любые другие данные.</p>
2
<p>Переменная под это понятие не попадает. Объектом первого рода считаются те данные, которые лежат в переменной:</p>
2
<p>Переменная под это понятие не попадает. Объектом первого рода считаются те данные, которые лежат в переменной:</p>
3
<p>Описанное выше вы проделывали множество раз, но есть одно "но". Функции тоже могут быть объектами первого рода:</p>
3
<p>Описанное выше вы проделывали множество раз, но есть одно "но". Функции тоже могут быть объектами первого рода:</p>
4
<p>Запустите код выше. Он работает! Давайте разбираться.</p>
4
<p>Запустите код выше. Он работает! Давайте разбираться.</p>
5
<p>Мы привыкли к такому определению функций:</p>
5
<p>Мы привыкли к такому определению функций:</p>
6
<p>У функции есть имя, которое указывается после ключевого слова function, а сама конструкция является инструкцией. Кстати, поэтому в конце нет точки с запятой. Мы не можем написать так:</p>
6
<p>У функции есть имя, которое указывается после ключевого слова function, а сама конструкция является инструкцией. Кстати, поэтому в конце нет точки с запятой. Мы не можем написать так:</p>
7
<p>Определение функции - это инструкция, поэтому оно не может подставляться в те места, где ожидаются выражения. Присваивание как раз подразумевает, что в правой части находится именно выражение. Соответственно, такой код падает с ошибкой, а вот следующий код уже работает:</p>
7
<p>Определение функции - это инструкция, поэтому оно не может подставляться в те места, где ожидаются выражения. Присваивание как раз подразумевает, что в правой части находится именно выражение. Соответственно, такой код падает с ошибкой, а вот следующий код уже работает:</p>
8
<p>Даже не вникая в синтаксис, можно сделать вывод, что конструкция справа от знака "равно" - это выражение, и оно порождает функцию. В PHP подобные функции называют<strong>анонимными</strong>, потому что у них нет имени. Глядя на код выше, нужно понимать, что определение функции и ее присваивание переменной - две разных операции. Чистое определение выглядит так:</p>
8
<p>Даже не вникая в синтаксис, можно сделать вывод, что конструкция справа от знака "равно" - это выражение, и оно порождает функцию. В PHP подобные функции называют<strong>анонимными</strong>, потому что у них нет имени. Глядя на код выше, нужно понимать, что определение функции и ее присваивание переменной - две разных операции. Чистое определение выглядит так:</p>
9
<p>Очень похоже на обычную функцию, за исключением отсутствия имени. Правда, есть еще и стилевые отличия, закрепленные стандартом<a>PSR-12</a>. В других языках анонимные функции нередко называют<strong>лямбда-функциями</strong>. В принципе, и в PHP их иногда зовут так же:</p>
9
<p>Очень похоже на обычную функцию, за исключением отсутствия имени. Правда, есть еще и стилевые отличия, закрепленные стандартом<a>PSR-12</a>. В других языках анонимные функции нередко называют<strong>лямбда-функциями</strong>. В принципе, и в PHP их иногда зовут так же:</p>
10
<p>Имя переменной можно выбирать произвольно, в этом смысле анонимные функции никак не влияют на ситуацию. Созданные именованные функции никуда не исчезают в процессе жизни программы. В отличие от них, анонимные функции постоянно создаются и пропадают вместе с переменными, в которые они записаны. Другими словами, анонимные функции всегда локальны относительно контекста и доступны там, где они были созданы, если не предпринимать специальных мер по их возврату.</p>
10
<p>Имя переменной можно выбирать произвольно, в этом смысле анонимные функции никак не влияют на ситуацию. Созданные именованные функции никуда не исчезают в процессе жизни программы. В отличие от них, анонимные функции постоянно создаются и пропадают вместе с переменными, в которые они записаны. Другими словами, анонимные функции всегда локальны относительно контекста и доступны там, где они были созданы, если не предпринимать специальных мер по их возврату.</p>
11
<p>Подобно именованным, анонимные функции могут принимать аргументы. В этом отношении поведение абсолютно идентично. Все, что мы изучали до этого момента для именованных функций, работает и для анонимных:</p>
11
<p>Подобно именованным, анонимные функции могут принимать аргументы. В этом отношении поведение абсолютно идентично. Все, что мы изучали до этого момента для именованных функций, работает и для анонимных:</p>
12
<p>Анонимная функция - это выражение, поэтому мы можем определять ее в любом месте программы, допускающем использование выражений - например, в теле другой функции:</p>
12
<p>Анонимная функция - это выражение, поэтому мы можем определять ее в любом месте программы, допускающем использование выражений - например, в теле другой функции:</p>
13
<p>Главное в коде выше - не забыть поставить return и помнить, что $a и $b снаружи анонимной функции не связаны с переменными, имеющими те же имена внутри анонимной функции.</p>
13
<p>Главное в коде выше - не забыть поставить return и помнить, что $a и $b снаружи анонимной функции не связаны с переменными, имеющими те же имена внутри анонимной функции.</p>
14
<p>В вашей голове может возникнуть вопрос "Зачем все это?". Все же анонимные функции появились в PHP не сразу. Их использование значительно повышает выразительные возможности языка, и в этом вы скоро убедитесь. Если же взять JavaScript, то там анонимные функции составляют костяк любой программы. Функции, создающие функции, возвращающие функции и принимающие функции как аргументы - это основной способ разрабатывать в JavaScript.</p>
14
<p>В вашей голове может возникнуть вопрос "Зачем все это?". Все же анонимные функции появились в PHP не сразу. Их использование значительно повышает выразительные возможности языка, и в этом вы скоро убедитесь. Если же взять JavaScript, то там анонимные функции составляют костяк любой программы. Функции, создающие функции, возвращающие функции и принимающие функции как аргументы - это основной способ разрабатывать в JavaScript.</p>
15
<h2>Стрелочные функции</h2>
15
<h2>Стрелочные функции</h2>
16
<p>Начиная с версии 7.4, в PHP появились<strong>стрелочные функции</strong>. Это те же анонимные функции, но с компактным синтаксисом. Они удобны в тех ситуациях, где тело функции занимает одну строку:</p>
16
<p>Начиная с версии 7.4, в PHP появились<strong>стрелочные функции</strong>. Это те же анонимные функции, но с компактным синтаксисом. Они удобны в тех ситуациях, где тело функции занимает одну строку:</p>
17
<p>Стрелочные функции появились в языке не просто так. Использование обычных анонимных функций всегда приводило к раздуванию кода из-за объемного синтаксиса. Теперь эта проблема практически уходит. Стрелочные функции достаточно компактны, и в дальнейших курсах применяются очень широко.</p>
17
<p>Стрелочные функции появились в языке не просто так. Использование обычных анонимных функций всегда приводило к раздуванию кода из-за объемного синтаксиса. Теперь эта проблема практически уходит. Стрелочные функции достаточно компактны, и в дальнейших курсах применяются очень широко.</p>
18
<h2>Передача обычных и анонимных функций</h2>
18
<h2>Передача обычных и анонимных функций</h2>
19
<p>Обычные функции в PHP не являются объектами первого рода. Несмотря на это, PHP может имитировать соответствующее поведение с помощью строк. Достаточно записать имя функции в переменную и вызвать ее:</p>
19
<p>Обычные функции в PHP не являются объектами первого рода. Несмотря на это, PHP может имитировать соответствующее поведение с помощью строк. Достаточно записать имя функции в переменную и вызвать ее:</p>
20
<p>Точно так же можно передать функцию в функцию:</p>
20
<p>Точно так же можно передать функцию в функцию:</p>
21
21