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>Этот код выдаст предупреждение<em>PHP Notice: Undefined variable: age</em>. Переменная $age определена вне контекста функции и невидима внутри. Точно такое же поведение и у анонимных функций:</p>
2 <p>Этот код выдаст предупреждение<em>PHP Notice: Undefined variable: age</em>. Переменная $age определена вне контекста функции и невидима внутри. Точно такое же поведение и у анонимных функций:</p>
3 <p>Но передача аргументов все же возможна, и делается она благодаря<strong>замыканию</strong>. С помощью этого механизма можно захватить переменные из внешнего окружения и использовать их внутри. Правда, это работает только для анонимных функций. Замыканием нередко называют и саму функцию, которая осуществила захват внешних переменных:</p>
3 <p>Но передача аргументов все же возможна, и делается она благодаря<strong>замыканию</strong>. С помощью этого механизма можно захватить переменные из внешнего окружения и использовать их внутри. Правда, это работает только для анонимных функций. Замыканием нередко называют и саму функцию, которая осуществила захват внешних переменных:</p>
4 <p>Захват переменных осуществляется с помощью ключевого слова use и списка переменных, который идет после этого слова. Крайне важно осознать, что use используется при определении функции, а не ее вызове.</p>
4 <p>Захват переменных осуществляется с помощью ключевого слова use и списка переменных, который идет после этого слова. Крайне важно осознать, что use используется при определении функции, а не ее вызове.</p>
5 <p>Может возникнуть закономерный вопрос: "Зачем это делать, если переменные можно передать в сам вызов?". Попробуем разобраться:</p>
5 <p>Может возникнуть закономерный вопрос: "Зачем это делать, если переменные можно передать в сам вызов?". Попробуем разобраться:</p>
6 <p>Замыкания полезны, когда функция определяется в одном месте, а используется в совершенно другом. Замыкание позволяет не таскать за собой гору переменных, а в некоторых ситуациях без него просто не обойтись.</p>
6 <p>Замыкания полезны, когда функция определяется в одном месте, а используется в совершенно другом. Замыкание позволяет не таскать за собой гору переменных, а в некоторых ситуациях без него просто не обойтись.</p>
7 <p>Вспомните функцию without() из пакета Funct. Она принимает на вход массив и значение, а возвращает новый массив, полученный фильтрацией старого по переданному значению. Его реализация построена на функциях высшего порядка и подразумевает фильтрацию. Сложность возникает при описании предиката, ведь внутри анонимной функции нужно сравнивать текущее значение и переданный элемент. Замыкание позволяет решить эту задачу просто:</p>
7 <p>Вспомните функцию without() из пакета Funct. Она принимает на вход массив и значение, а возвращает новый массив, полученный фильтрацией старого по переданному значению. Его реализация построена на функциях высшего порядка и подразумевает фильтрацию. Сложность возникает при описании предиката, ведь внутри анонимной функции нужно сравнивать текущее значение и переданный элемент. Замыкание позволяет решить эту задачу просто:</p>
8 <p>Без добавления use ($value) ничего не получится, потому что $value не виден внутри анонимной функции.</p>
8 <p>Без добавления use ($value) ничего не получится, потому что $value не виден внутри анонимной функции.</p>
9 <p>В замыкание можно передать данные по ссылке, что позволит их менять внутри. Но делать так никогда не стоит. Подобное использование создает невероятно сложный в отладке и сопровождении код. Единственная причина, по которой можно использовать передачу по ссылке - рекурсия внутри анонимной функции. Подробнее об этом в другом курсе.</p>
9 <p>В замыкание можно передать данные по ссылке, что позволит их менять внутри. Но делать так никогда не стоит. Подобное использование создает невероятно сложный в отладке и сопровождении код. Единственная причина, по которой можно использовать передачу по ссылке - рекурсия внутри анонимной функции. Подробнее об этом в другом курсе.</p>
10 <h2>Стрелочные функции</h2>
10 <h2>Стрелочные функции</h2>
11 <p>Главная цель введения стрелочных функций - это создание более лаконичного кода. Поэтому кроме сокращенного синтаксиса, они получили автоматический захват внешних переменных. Другими словами, при использовании стрелочных функций нам не нужен use:</p>
11 <p>Главная цель введения стрелочных функций - это создание более лаконичного кода. Поэтому кроме сокращенного синтаксиса, они получили автоматический захват внешних переменных. Другими словами, при использовании стрелочных функций нам не нужен use:</p>
12  
12