5

http://us1.php.net/manual/en/functions.anonymous.phpの PHP の例を見ていますClosures

以下のコード例を提供し、次のように述べています。

クロージャーは、親スコープから変数を継承する場合もあります。このような変数は、関数ヘッダーで宣言する必要があります。親スコープから変数を継承することは、グローバル変数を使用することと同じではありません。グローバル変数は、実行中の関数に関係なくグローバル スコープに存在します。クロージャーの親スコープは、クロージャーが宣言された関数です (必ずしもそれが呼び出された関数ではありません)。次の例を参照してください。

私はこれがどのように機能しているのか混乱しています。 $quantity変数は、$productClosure 関数内で使用できるようには思えません。Parent Scopeこの場合、be 1 スコープアップではありませんgetTotal()か?

ここに画像の説明を入力

4

3 に答える 3

12

関数のシグネチャを誤解しています。$quantityand$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"
于 2013-09-04T18:35:31.470 に答える
1

クロージャー引数$quantity$productは、関数定義自体には存在しません。それらは、実行手順中に array_walk が実際の値で満たす単なるプレースホルダーです。引数は、array_walk 呼び出しのスコープにインポートする追加のuse変数であり、それ以外の場合は関数で使用できません。

于 2013-09-04T18:38:50.803 に答える