Я имею:
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
Мое понимание:
на $inside = outside( 2 );
это возвращает анонимную функцию и
присваивает его переменной$inside
, Анонимная функция использует
ценность $limit
(2) и $tally
(0).
функция $inside()
называется. Это увеличивает $tally
в 1
значение запоминается как-то и так $limit
, Какова цель
перед амперсандом $tally
? Я знаю, что это используется для создания
ссылки, но в этом контексте это меня смущает. Как можно это закрытие
помните ценность $limit
?
Любые ссылки на официальную документацию помогут!
Анонимные функции на самом деле Closure
объекты в php. Если вы добавите var_dump($invoke)
к вашему коду вы увидите это:
object(Closure)#1 (1) {
["static"]=>
array(2) {
["limit"]=>
int(2)
["tally"]=>
int(0)
}
}
use
переменные хранятся в static
массив в объекте замыкания. Когда вы вызываете замыкание, эти переменные передаются в функцию, как обычные аргументы. Поэтому, если вы не используете ссылку, они будут переданы путем копирования, и любые изменения в них в функции не будут иметь никакого эффекта.
&
означает, что вы передаете аргумент по ссылке, а не по значению. Это означает, что вы можете изменить переменную внутри функции, и она будет запомнена снаружи, а не только в этой функции.
Назначая функцию $inside
вы фактически сохраняете ссылку на переменную нетронутой, поэтому она будет запоминаться от вызова к вызову.
Увидеть PHP: передача по ссылке