【问题标题】:Use keyword in functions - PHP [duplicate]在函数中使用关键字 - PHP [重复]
【发布时间】:2011-09-13 07:31:05
【问题描述】:

可能重复:
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 关键字,它在命名空间中使用,但在这里看起来不同。

谢谢。

【问题讨论】:

  • 完全相同的问题here
  • 评论 /* use ($tax, &$total) */ 会回答这个问题。敢于探索:)

标签: php closures anonymous-function


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      另外需要指出的是,$tax 是作为副本传递的,而 $total 是通过引用传递的(通过在前面附加 & 符号)。通过引用传递允许闭包修改变量的值。在这种情况下,对 $tax 值的任何更改将仅在关闭期间生效,而 $total 的实际值。

      【讨论】:

      • 感谢您指出传递引用部分。我完全没有注意到它..
      • 添加。数组也通过副本传递。但在 PHP 中,它是惰性副本。这意味着只有在您开始对其进行更改时才会复制它。点,您不必担心性能。
      • 您好,感谢您的解释。但我有一个小疑问,我们也可以将范围外定义的变量作为参数传递给闭包。那么为什么我们使用“use”关键字来做同样的事情。
      猜你喜欢
      • 1970-01-01
      • 2012-04-15
      • 2013-12-17
      • 2017-09-17
      • 1970-01-01
      • 2011-12-03
      • 2012-08-25
      • 2021-09-17
      • 2017-11-25
      相关资源
      最近更新 更多