Я рассматриваю PHP-пример Closures
на http://us1.php.net/manual/en/functions.anonymous.php
Он предоставляет пример кода ниже и указывает:
Закрытие также может наследовать переменные из родительской области. Любые такие переменные должны быть объявлены в заголовке функции. Наследование переменных из родительской области не совпадает с использованием глобальных переменных. Глобальные переменные существуют в глобальной области, что то же самое независимо от того, какая функция выполняется. Родительская область замыкания – это функция, в которой было объявлено закрытие (не обязательно функция, из которой она была вызвана). См. Следующий пример:
Я смущен тем, как это работает. $quantity
и $product
variables мне не кажется, что они будут доступны внутри функции Closure. Разве в этом случае функция Parent Scope
бы 1-й областью в функции getTotal()
?
Вы недопонимаете подпись функции. $quantity
и $product
являются регулярными аргументами, которые будут переданы в функцию при ее вызове, они действительно не существуют в родительской области и не предназначены. use ($tax, &$total)
– это закрытые переменные из родительской области.
$foo = 'foo'; // closed over variable // vvvv $func = function ($bar) use ($foo) { // ^^^^ // regular function argument return $foo . $bar; }; echo $func('baz'); // "foobaz"
Аргументы замыкания $quantity
и $product
не существуют сами по себе в определении функции, они просто заполнители, которые array_walk заполняет реальными значениями во время процедуры его выполнения. Аргументы use
– дополнительные переменные, которые вы импортируете в область вызова array_walk, которая в противном случае была бы недоступна для этой функции.
Две переменные – это вопрос, который передается в обратный вызов array_walk .
Первый параметр будет передан как значение каждого из элементов в массиве, второй будет ключом массива.
Замкнутыми переменными являются те, которые указаны в предложении use
.