php 初始化匿名函数/闭包的“use”变量

php initialize "use" variable for anonymous function / closure

提问人:lm713 提问时间:5/27/2022 更新时间:5/27/2022 访问量:47

问:

有没有一种巧妙的方法来初始化闭包中使用的变量?

function() use($v = 0) { echo ++$v }

...不起作用

一个示例用例是array_reduce,我们可能想要计算数组元素...

echo array_reduce(['a', 'b', 'c'], function($output, $item) use(&$count) { return $output . ++$count . '. ' . $item . "\n"; }, '');

这将起作用 - 通过引用声明$count并从 null 递增不会产生错误 - 但我认为这不是“好做法”。

PHP 闭包 匿名函数

评论

0赞 Álvaro González 5/27/2022
如果你不能将它合并到回调签名中,你实际上是在函数中引入一个全局变量,在其他地方引起副作用。我想不出一个干净的解决方案;该声明至少明确了这一点。use

答:

1赞 Chris Haas 5/27/2022 #1

您可以使用初始化一次的变量。static

echo array_reduce(['a', 'b', 'c'], function($output, $item) { static $count = 0; return $output . ++$count . '. ' . $item . "\n"; }, '');

演示:https://3v4l.org/D0Nv2

评论

0赞 lm713 5/27/2022
太棒了,谢谢:-)这真的很整洁,我希望对性能的影响很小或没有影响 - php 只是跳过后续迭代的行?我现在将实施它:-)
0赞 Álvaro González 5/28/2022
@lm713 此变量是函数内部的,您不能从外部读取它。这可能是您从一开始就真正想到的,但值得注意的是,它并不是真正的替代实现,而是不同的东西。
0赞 lm713 5/28/2022
@ÁlvaroGonzález谢谢你 - 是的,你是对的,这并不完全是我的想法,但它似乎是最接近可用的东西,并且适合示例用例,所以我将把它作为公认的答案,直到 PHP 使类似的东西成为可能。另一方面,如果父作用域中需要 $v,我认为在闭包声明之外初始化它并不那么混乱。use($v=0)