【问题标题】:PHP Closures scoping of variablesPHP 闭包变量的作用域
【发布时间】:2013-09-08 09:37:03
【问题描述】:

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

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

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

我很困惑这是如何工作的。 $quantity$product 变量在我看来并不在 Closure 函数中可用。在这种情况下 getTotal() 函数不会是 Parent Scope 的 1 个作用域吗?

【问题讨论】:

标签: php closures


【解决方案1】:

您误解了函数签名。 $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"

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-05-02
        • 2011-01-19
        • 1970-01-01
        • 2011-08-03
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 2014-03-05
        • 1970-01-01
        相关资源
        最近更新 更多