5

我正在查看http://us1.php.net/manual/en/functions.anonymous.phpClosures上的 PHP 示例

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

闭包也可以从父作用域继承变量。任何此类变量都必须在函数头中声明。从父作用域继承变量与使用全局变量不同。全局变量存在于全局范围内,无论执行什么函数都是一样的。闭包的父作用域是声明闭包的函数(不一定是调用它的函数)。请参见以下示例:

我很困惑这是如何工作的。 在我看来$quantity,变量在闭包函数中不可用。在这种情况下,功能$product不是Parent Scope1 范围吗?getTotal()

在此处输入图像描述

4

3 回答 3

12

您误解了函数签名。$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"
于 2013-09-04T18:35:31.470 回答
1

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

于 2013-09-04T18:38:50.803 回答
0

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

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

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

于 2013-09-04T18:37:35.350 回答