Анонимные функции и замыкания
Пишите встроенные функции и захватывайте переменные с помощью use.
«Анонимные функции и замыкания» — бесплатный урок PHP Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.
Что такое анонимные функции
Анонимная функция (лямбда) — это функция без имени. В PHP она является экземпляром встроенного класса Closure и может храниться в переменной, передаваться как аргумент или возвращаться из другой функции.
Простая анонимная функция
Присвойте функцию переменной и вызовите её:
<?php
$double = function(int $n): int {
return $n * 2;
};
echo $double(5); // 10
echo $double(21); // 42Передача анонимных функций
Передавайте замыкание в качестве аргумента функциям вроде array_map, usort или собственным функциям обратного вызова:
<?php
$nums = [3, 1, 4, 1, 5, 9];
$squared = array_map(function(int $n): int {
return $n ** 2;
}, $nums);
print_r($squared); // [9, 1, 16, 1, 25, 81]Возврат функций
Функция может создать и вернуть замыкание — это паттерн фабрики:
<?php
function makeMultiplier(int $factor): Closure {
return function(int $n) use ($factor): int {
return $n * $factor;
};
}
$triple = makeMultiplier(3);
$tenX = makeMultiplier(10);
echo $triple(5); // 15
echo $tenX(5); // 50Замыкания и use
Замыкания могут захватывать переменные из внешней области видимости с помощью use. Захват выполняется по значению (создаётся копия), если не добавить &:
<?php
$taxRate = 0.18;
$addTax = function(float $price) use ($taxRate): float {
return $price * (1 + $taxRate);
};
$taxRate = 0.20; // change outer variable
echo $addTax(100); // 118 — captured value at creation timeЗахват по ссылке с use(&)
Чтобы замыкание видело обновлённые внешние значения, используйте захват по ссылке:
<?php
$count = 0;
$increment = function() use (&$count): void {
$count++;
};
$increment();
$increment();
echo $count; // 2Стрелочные функции (PHP 7.4)
Стрелочные функции — это компактные замыкания с одним выражением, которые автоматически захватывают внешнюю область видимости по значению:
<?php
$rate = 1.18;
$prices = [10, 20, 30];
// Arrow function — no 'use' needed
$withTax = array_map(fn($p) => $p * $rate, $prices);
print_r($withTax); // [11.8, 23.6, 35.4]Стрелочные функции не могут изменять внешнюю область видимости
Стрелочные функции захватывают переменные только по значению — они не могут изменять внешние переменные:
<?php
$total = 0;
$nums = [1, 2, 3];
// This does NOT modify $total!
array_walk($nums, fn($n) => $total += $n);
echo $total; // 0
// Use a reference closure for mutation:
array_walk($nums, function($n) use (&$total) { $total += $n; });
echo $total; // 6Замыкания как функции обратного вызова
Многие функции PHP принимают вызываемый объект — можно передать замыкание, массив [$obj, 'method'] или строковое имя функции:
<?php
$words = ['banana', 'apple', 'cherry'];
usort($words, fn($a, $b) => strcmp($a, $b));
print_r($words); // ['apple', 'banana', 'cherry']Замыкание с немедленным вызовом
Вы можете определить и вызвать замыкание в одной строке — это удобно для создания изолированной области видимости:
<?php
$result = (function(): int {
$x = 10;
$y = 20;
return $x + $y;
})();
echo $result; // 30
// $x and $y are not in outer scopeClosure::bind и bindTo
Вы можете привязать замыкание к контексту другого объекта с помощью Closure::bind():
<?php
class Counter {
private int $value = 0;
}
$increment = Closure::bind(function(int $by): void {
$this->value += $by;
}, new Counter(), Counter::class);
// Now $increment has access to private $valueБыстрая проверка
В чём основное различие между обычным замыканием с use и стрелочной функцией в PHP?
Итоги: анонимные функции и замыкания
Краткое содержание:
- Анонимные функции хранятся в переменных и передаются как значения
- Замыкания захватывают внешние переменные с помощью
use($var)(по значению) илиuse(&$var)(по ссылке) - Стрелочные функции (PHP 7.4) автоматически захватывают внешнюю область видимости по значению
- Полезны для функций обратного вызова: array_map, usort, array_filter…
- Могут возвращаться фабричными функциями
Часто задаваемые вопросы
Урок «Анонимные функции и замыкания» бесплатный?
Да — полный текст урока «Анонимные функции и замыкания» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.
Чему я научусь в уроке «Анонимные функции и замыкания»?
Пишите встроенные функции и захватывайте переменные с помощью use. Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать PHP Academy?
Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Анонимные функции и замыкания»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке PHP Academy?
Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Определение и вызов функций
- Параметры по умолчанию и вариативные параметры
- Область видимости переменных: локальная и глобальная
- Анонимные функции и замыкания