PHP – 在PHP 5.3.0中,“use”标识符的功能是什么?

我正在检查一些PHP 5.3.0功能,并在网站上看到一些看起来很有趣的代码:

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

    $callback =
        /* This line here: */
        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);
}

作为匿名函数的例子之一。

有人知道吗?任何文档?它看起来很邪恶,是否应该使用它?


这就是PHP如何表达闭包。这根本不是邪恶的,事实上它非常强大和有用。

基本上这意味着你允许匿名函数“捕获”它之外的局部变量(在这种情况下,$tax以及对其的引用$total)并且将它们的值(或者在$total引用$total自身的情况下)保存为状态匿名函数本身。


一个更简单的答案。

function ($quantity) use ($tax, &$total) { .. };

  1. 闭包是分配给变量的函数,所以你可以传递它
  2. 闭包是一个独立的命名空间,通常情况下,你不能访问在这个命名空间之外定义的变量。有关键字use
  3. 使用允许您访问(使用)闭包中的后续变量。
  4. 使用是早期绑定。这意味着变量值在定义闭包时被复制。因此修改$tax闭包内部没有外部效果,除非它是一个指针,就像一个对象。
  5. 你可以像指针一样传递变量&$total。这样,修改$totalDOES 的值有一个外部影响,原始变量的值会改变。
  6. 闭包内部定义的变量无法从闭包外部访问。
  7. 关闭和功能具有相同的速度。是的,你可以在脚本中使用它们。

正如@Mytskine 指出的,最好的深入解释是闭包RFC。(Upvote他为此。)

Tags:

添加评论

友情链接:蝴蝶教程