Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про PHP: closure, anonymous

Что такое замыкание и анонимные функции?

Этот вопрос проверяет понимание функциональных возможностей PHP, включая анонимные функции и замыкания, а также их практическое применение.

Короткий ответ

Анонимная функция - это функция без имени, которая может быть присвоена переменной или передана как аргумент. Замыкание - это анонимная функция, которая "запоминает" контекст, в котором была создана, и может обращаться к переменным из внешней области видимости. Замыкания используются для создания callback-функций, обработчиков событий и реализации шаблонов проектирования. Ключевое слово use позволяет передавать переменные в замыкание.

Длинный ответ

Определения

Анонимная функция

Функция без имени, которая может быть сохранена в переменной или передана как аргумент.

Замыкание (Closure)

Специальный тип анонимной функции, которая захватывает переменные из внешней области видимости.

Базовый синтаксис

Создание анонимной функции

php

// Простая анонимная функция
$greeting = function($name) {
    return "Hello, $name!";
};

echo $greeting('John'); // Hello, John!

Замыкание с использованием внешних переменных

php

$prefix = "Welcome";

// Замыкание с захватом переменной $prefix
$welcome = function($name) use ($prefix) {
    return "$prefix, $name!";
};

echo $welcome('Alice'); // Welcome, Alice!

Практическое применение

Callback функции

php

// Использование в array_map
$numbers = [1, 2, 3, 4, 5];

$squared = array_map(function($n) {
    return $n * $n;
}, $numbers);

print_r($squared); // [1, 4, 9, 16, 25]

Создание фабрик функций

php

function createMultiplier($factor) {
    return function($number) use ($factor) {
        return $number * $factor;
    };
}

$double = createMultiplier(2);
$triple = createMultiplier(3);

echo $double(5); // 10
echo $triple(5); // 15

Особенности замыканий

Захват переменных по значению и по ссылке

php

// По значению (по умолчанию)
$count = 0;
$increment = function() use ($count) {
    // $count копируется, оригинал не меняется
    return ++$count;
};

echo $increment(); // 1
echo $increment(); // 1
echo $count;       // 0

// По ссылке
$count = 0;
$increment = function() use (&$count) {
    // Работает с оригинальной переменной
    return ++$count;
};

echo $increment(); // 1
echo $increment(); // 2
echo $count;       // 2

Доступ к $this в классах

php

class Calculator {
    private $base = 10;
    
    public function getMultiplier() {
        // В контексте класса можно использовать $this
        return function($x) {
            return $x * $this->base;
        };
    }
}

$calc = new Calculator();
$multiplier = $calc->getMultiplier();
echo $multiplier(5); // 50

Расширенное использование

Замыкания как аргументы функций

php

function processData($data, $processor) {
    $result = [];
    
    foreach ($data as $item) {
        $result[] = $processor($item);
    }
    
    return $result;
}

$numbers = [1, 2, 3, 4];
$processed = processData($numbers, function($n) {
    return $n * 2 + 1;
});

print_r($processed); // [3, 5, 7, 9]

Создание middleware цепочек

php

function createMiddlewareStack() {
    $stack = [];
    
    return [
        'add' => function($middleware) use (&$stack) {
            $stack[] = $middleware;
        },
        'run' => function($request) use (&$stack) {
            $result = $request;
            
            foreach ($stack as $middleware) {
                $result = $middleware($result);
            }
            
            return $result;
        }
    ];
}

$app = createMiddlewareStack();
$app['add'](function($req) { return $req . ' -> logged'; });
$app['add'](function($req) { return $req . ' -> processed'; });

echo $app['run']('request'); // request -> logged -> processed

Класс Closure

Методы класса Closure

php

$closure = function($a, $b) {
    return $a + $b;
};

// Получение информации о замыкании
$reflection = new ReflectionFunction($closure);
echo "Параметры: " . $reflection->getNumberOfParameters(); // 2

// Привязка к объекту (PHP 7+)
class Context {
    private $value = 100;
}

$context = new Context();
$boundClosure = Closure::bind(function($x) {
    return $this->value + $x;
}, $context, 'Context');

echo $boundClosure(5); // 105

Производительность и лучшие практики

Советы по использованию

  • Используйте замыкания для коротких callback-функций

  • Избегайте сложной логики внутри замыканий

  • Будьте осторожны с захватом больших объектов

  • Используйте строгую типизацию когда возможно

php

// Типизированное замыкание
$calculator = function(int $a, int $b): int {
    return $a + $b;
};

Вывод: Замыкания и анонимные функции - мощный инструмент в PHP, который enables функциональный стиль программирования. Они особенно полезны для callback-ов, обработчиков событий и создания гибких, переиспользуемых компонентов. Правильное использование замыканий делает код более выразительным и модульным.

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    6

Навыки

  • PHP

    PHP

Ключевые слова

#closure

#anonymous

Подпишись на PHP Developer в телеграм

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.