0Pricing
PHP Academy · Урок

Анонимные функции и замыкания

Пишите встроенные функции и захватывайте переменные с помощью 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 scope

Closure::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 — локальная установка не требуется.

Все уроки этого курса

  1. Определение и вызов функций
  2. Параметры по умолчанию и вариативные параметры
  3. Область видимости переменных: локальная и глобальная
  4. Анонимные функции и замыкания
← Назад к PHP Academy