2014-10-07 2 views
3

у меня есть:закрытие PHP в анонимной функции и ссылки и

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?

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

+0

Теперь есть интересный код! Некоторое время не видели этого. – matrixdevuk

+2

Я действительно протестую, что этот вопрос является дубликатом. Хотя это очень похоже, этот вопрос больше посвящен переменной, передаваемой по ссылке, а не использованию самого ключевого слова 'use'. – Scopey

ответ

5

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

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

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

+0

Как значение $ limit сохраняется в последующих вызовах, когда оно не объявлено как ссылка? –

+0

О, хорошо, так как его статическое свойство закрывающего объекта значение сохраняется во всех последующих вызовах? Я думаю, что теперь лучше. –

3

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

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

См PHP: Passing by Reference

+0

Я думал, что внутри функции ключевое слово, «static» использовалось для целей «запоминания», а не для амперсанда для запоминания –

+0

Да, это сработало бы, но «&» означает, что вы можете передать переменную извне функции, например ссылку на объект или глобальное значение (которое не является одной и той же переменной каждый раз), то есть оно должно быть установлено на переменную вне функции. – worldofjr

+0

Вы также можете передать переменную по значению (без '&'), а затем вернуть это значение из функции и установить ее в одну и ту же переменную. Это будет функционально одинаково. Но если вам нужна функция для изменения двух переменных (например), то это становится более сложным. – worldofjr

Смежные вопросы