PHP闭包变量的范围

时间:2013-09-04 18:32:51

标签: php closures

我正在查看http://us1.php.net/manual/en/functions.anonymous.php

Closures的PHP示例

它提供了下面的示例代码并说明:

  

闭包还可以从父作用域继承变量。任何这样的   变量必须在函数头中声明。继承   父作用域中的变量与使用全局不同   变量。全局变量存在于全局范围内,即   无论执行什么功能都一样。 a的父范围   闭包是声明闭包的功能(不是   必然是从它调用的功能)。请参阅以下内容   例如:

我很困惑这是如何工作的。我认为$quantity$product变量在Closure函数中不可用。在这种情况下Parent Scope功能不是getTotal()是1范围?

enter image description here

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分:1)

闭包参数$quantity$product本身并不存在于函数定义中,它们只是占位符,array_walk将在其执行过程中填充实际值。 use参数是您导入 array_walk调用的范围的额外变量,否则该函数无法使用。

答案 2 :(得分:0)

这两个变量是问题是array_walk传递给回调的内容。

第一个参数将作为数组中每个元素的值传递,第二个参数将是数组的键。

关闭的变量是use子句中引用的变量。