закрытие php в анонимной функции и справке & amp;

Я имею:

function outside( $limit ) {

$tally = 0;

return function() use ( $limit, &$tally ) {
$tally++;

if( $tally > $limit ) {
echo "limit has been exceeded";
}
};
}

$inside = outside( 2 );
$inside();
$inside();
$inside();

Выходы: limit has been exceeded

Мое понимание:

  1. на $inside = outside( 2 ); это возвращает анонимную функцию и
    присваивает его переменной$inside, Анонимная функция использует
    ценность $limit (2) и $tally (0).

  2. функция $inside() называется. Это увеличивает $tally в 1
    значение запоминается как-то и так $limit, Какова цель
    перед амперсандом $tally? Я знаю, что это используется для создания
    ссылки, но в этом контексте это меня смущает. Как можно это закрытие
    помните ценность $limit?

Любые ссылки на официальную документацию помогут!

4

Решение

Анонимные функции на самом деле Closure объекты в php. Если вы добавите var_dump($invoke) к вашему коду вы увидите это:

object(Closure)#1 (1) {
["static"]=>
array(2) {
["limit"]=>
int(2)
["tally"]=>
int(0)
}
}

useпеременные хранятся в static массив в объекте замыкания. Когда вы вызываете замыкание, эти переменные передаются в функцию, как обычные аргументы. Поэтому, если вы не используете ссылку, они будут переданы путем копирования, и любые изменения в них в функции не будут иметь никакого эффекта.

6

Другие решения

& означает, что вы передаете аргумент по ссылке, а не по значению. Это означает, что вы можете изменить переменную внутри функции, и она будет запомнена снаружи, а не только в этой функции.

Назначая функцию $insideвы фактически сохраняете ссылку на переменную нетронутой, поэтому она будет запоминаться от вызова к вызову.

Увидеть PHP: передача по ссылке

3