在函数中使用关键字 - PHP

时间:2011-06-12 06:25:02

标签: php closures anonymous-function

  

可能重复:
  In Php 5.3.0 what is the Function “Use” Identifier ? Should a sane programmer use it?

我一直在研究PHP中的闭包,这引起了我的注意:

public function getTotal($tax)
    {
        $total = 0.00;

        $callback =
            function ($quantity, $product) use ($tax, &$total)
            {
                $pricePerItem = constant(__CLASS__ . "::PRICE_" .
                    strtoupper($product));
                $total += ($pricePerItem * $quantity) * ($tax + 1.0);
            };

        array_walk($this->products, $callback);
        return round($total, 2);
    }

有人请在此代码中解释use的用法。

function ($quantity, $product) use ($tax, &$total)

当我在PHP中搜索use时,会找到use关键字,在命名空间中使用它,但在这里它看起来不同。

感谢。

3 个答案:

答案 0 :(得分:105)

在这种情况下,“使用”的使用也是正确的。

使用闭包,要访问函数上下文之外的变量,您需要使用use函数显式授予函数权限。在这种情况下,它意味着您授予函数访问$ tax和$ total变量的权限。

您会注意到$ tax作为getTotal函数的参数传递,而$ total设置在定义闭包的行的正上方。

另一点需要指出的是,$ tax作为副本传递,而$ total通过引用传递(通过在前面附加& sign)。通过引用传递允许闭包修改变量的值。在这种情况下,$ tax值的任何变化只会在封闭期间有效,而$ total的实际价值。

答案 1 :(得分:15)

当你在PHP中声明一个匿名函数时,你需要告诉它应该关闭它周围范围(如果有的话)的哪些变量 - 它们不会自动关闭函数体中提到的任何范围内的词法变量。 use之后的列表只是要关闭的变量列表。

答案 2 :(得分:2)

这意味着你的内部函数可以使用外部函数的变量$ tax和$ total,而不仅仅是它的参数。