在PHP中,什么是闭包,为什么它使用“use”标识符?

2022-08-30 05:53:14

我正在检查一些功能,并在网站上遇到了一些看起来很有趣的代码: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);
}

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

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


答案 1

一个更简单的答案。

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

  1. 闭包是分配给变量的函数,因此您可以将其传递
  2. 闭包是一个单独的命名空间,通常,您不能访问在此命名空间外部定义的变量。有一个使用关键字:
  3. use 允许您访问(使用)闭包内的后续变量。
  4. 使用是早期绑定。这意味着变量值在定义闭包时被复制。因此,在闭包内部进行修改没有外部影响,除非它是指针,就像对象一样。$tax
  5. 您可以将变量作为指针传入,如 .这样,修改值确实具有外部影响,原始变量的值就会发生变化。&$total$total
  6. 闭包内部定义的变量也无法从闭包外部访问。
  7. 闭包和函数具有相同的速度。是的,您可以在脚本中使用它们。

正如@Mytskine指出的那样,最好的深入解释可能是闭包的RFC。(为此为他投票。


答案 2

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

基本上,这意味着您允许匿名函数在其范围之外“捕获”局部变量(在本例中为对 )的引用,并将其值(或在对自身的引用的情况下)保留为匿名函数本身内的状态。$tax$total$total$total


推荐