2013-09-04 6 views
5

Я смотрю на примере PHP из Closures на http://us1.php.net/manual/en/functions.anonymous.phpPHP Затворы область видимости переменных

Это дает пример кода ниже, и заявляет:

Затворы могут наследовать переменные из родительской области. Любые такие переменные должны быть объявлены в заголовке функции. Наследование переменных из родительской области не совпадает с использованием глобальных переменных . Глобальные переменные существуют в глобальной области, которая равна , независимо от того, какая функция выполняет. Родительская область закрытия - это функция, в которой было объявлено закрытие (а не обязательно функция, из которой она была вызвана). См. Следующий пример :

Я смущен относительно того, как это работает. $quantity и $product переменные мне не кажутся, что они будут доступны внутри функции Closure. Разве не будет Parent Scope в этом случае функцией getTotal()?

enter image description here

+0

Похоже, что этот вопрос: [В Php 5.3.0 что такое функция «Использовать» идентификатор? Должен ли разумный программист использовать его?] (Http://stackoverflow.com/questions/1065188/in-php-5-3-0-what-is-the-function-use-identifier-should-a-sane-programmer -us) –

+1

Посмотрите документацию на массивную прогулку ... вот где эти параметры нажимают на функцию. – Orangepill

ответ

11

Вы недопонимание функцию подписи. $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" 
0

Два переменной вопрос то, что получить передается в функцию обратного вызова с помощью array_walk.

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

Замкнутые переменные, указанные в пункте use.

1

Аргументы закрытия $quantity и $product не существуют сами по себе в определении функции, они являются просто заполнителями, которые array_walk заполняет реальными значениями во время выполнения процедуры. Аргументы use являются дополнительными переменными, которые вы вносите в номер array_walk, который в противном случае не был бы доступен для функции.

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