Этот вопрос проверяет понимание функциональных возможностей PHP, включая анонимные функции и замыкания, а также их практическое применение.
Анонимная функция - это функция без имени, которая может быть присвоена переменной или передана как аргумент. Замыкание - это анонимная функция, которая "запоминает" контекст, в котором была создана, и может обращаться к переменным из внешней области видимости. Замыкания используются для создания callback-функций, обработчиков событий и реализации шаблонов проектирования. Ключевое слово use позволяет передавать переменные в замыкание.
Функция без имени, которая может быть сохранена в переменной или передана как аргумент.
Специальный тип анонимной функции, которая захватывает переменные из внешней области видимости.
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!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); // 15php
// По значению (по умолчанию)
$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; // 2php
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); // 50php
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]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 -> processedphp
$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-ов, обработчиков событий и создания гибких, переиспользуемых компонентов. Правильное использование замыканий делает код более выразительным и модульным.