Замыкание-счётчик с захватом по ссылке
Напишите функцию builder, которая принимает целое число и возвращает замыкание. Каждый вызов возвращённого замыкания добавляет свой аргумент к накапливаемой сумме и возвращает новое значение, чтобы состояние сохранялось между вызовами.
<?php
$a = builder(5);
echo $a(3); // 8
echo $a(1); // 9
function builder(int $in) {
// ваш код здесь
}
Допишите реализацию.
Верните анонимную функцию, захватывающую $in по ссылке через use (&$in). Захват по ссылке позволяет замыканию менять одну и ту же переменную между вызовами, поэтому накапливаемая сумма сохраняется. Без & каждый вызов стартовал бы от исходного $in, так как значение копируется в момент определения.
- ✗Захват по значению (
use ($in)) с ожиданием, что сумма сохранится между вызовами - ✗Считать, что замыкания PHP автоматически связывают внешнюю область как в JavaScript, без явного
use - ✗Путать захват по ссылке
use (&$in)соstatic-переменной внутри замыкания
- →Чем
use ($in)отличается отuse (&$in)в момент определения замыкания? - →Что автоматически захватывает стрелочная функция
fn() =>— по значению или по ссылке?
Замыкание захватывает внешние переменные явно через use. По умолчанию захват идёт по значению — копия делается в момент определения замыкания, и последующие изменения внешней переменной замыкание не видит.
<?php
function builder(int $in) {
return function (int $i) use (&$in) {
$in += $i; // меняем ту же переменную
return $in;
};
}
$a = builder(5);
echo $a(3); // 8
echo $a(1); // 9
echo $a(4); // 13
Ключевой момент — & в use (&$in). Без него каждый вызов начинал бы с исходной копии 5, и сумма не копилась бы. Стрелочные функции (fn() =>) захватывают переменные автоматически и всегда по значению.