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

10 浏览
0 Comments

在PHP中,闭包是什么,为什么要使用“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);
}

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

有人了解这个吗?有文档吗?它看起来很邪恶,应该使用吗?

admin 更改状态以发布 2023年5月21日
0
0 Comments

这是 PHP 表达 闭包 的方式。它并不邪恶,实际上非常强大和有用。

基本上,这意味着你允许匿名函数“捕捉”外部作用域中的局部变量(在本例中为 $tax 和对 $total 的引用),并将其值(或在 $total 的情况下是对 $total 本身的引用)作为匿名函数自身的状态而保存。

0
0 Comments

一个更简单的解释。

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

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

正如@Mytskine在此贴中指出的,最好的深度解释可能是关于闭包的RFC。(为此点赞他。)

0