在PHP中,闭包是什么,为什么要使用“use”标识符?
在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日
这是 PHP 表达 闭包 的方式。它并不邪恶,实际上非常强大和有用。
基本上,这意味着你允许匿名函数“捕捉”外部作用域中的局部变量(在本例中为 $tax
和对 $total
的引用),并将其值(或在 $total
的情况下是对 $total
本身的引用)作为匿名函数自身的状态而保存。
一个更简单的解释。
function ($quantity) use ($tax, &$total) { .. };
- 闭包是一个分配给变量的函数,因此可以传递它
- 闭包是一个单独的命名空间,通常情况下,您无法访问在此命名空间外定义的变量。这时使用use关键字:
- use允许您在闭包中访问(使用)后续的变量。
- use是早期绑定。这意味着变量值在定义闭包时被复制。因此,在闭包内修改
$tax
没有外部影响,除非它是指针,比如对象。 - 您可以像在
&$total
的情况下一样传递变量作为指针。这样,修改$total
的值具有外部影响,原始变量的值会更改。 - 在闭包内定义的变量也无法从闭包外部访问。
- 闭包和函数的速度相同。是的,您可以在所有脚本中使用它们。