HTML Diff
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