PHP中用for循环生成函数数组遇作用域问题求解决方案
PHP循环中创建匿名函数的作用域问题解决方法
你的问题核心是匿名函数未正确捕获循环变量的当前值。默认情况下,匿名函数不会自动引入父作用域的变量,调用时函数体内的$i会被当作局部变量,而此时循环已经执行完毕,就算声明global $i,拿到的也是循环结束后的10,同样不符合预期。
下面是两种简洁的解决方法,不需要用到面向对象:
1. 使用use关键字捕获变量值
通过use关键字将当前循环迭代的$i值传递到匿名函数作用域中,每个函数会持有独立的变量副本:
$list = []; $i = 0; for (; $i < 10; $i++) { $list[] = function() use ($i) { return $i; }; } echo $list[6](); // 输出6
这里的use ($i)是按值传递,确保每个匿名函数捕获的是当前循环的$i状态,而非后续修改后的引用。
2. 使用箭头函数(PHP 7.4+)
PHP 7.4及以上支持箭头函数,它会自动继承父作用域的变量(按值传递),代码更简洁:
$list = []; $i = 0; for (; $i < 10; $i++) { $list[] = fn() => $i; } echo $list[6](); // 输出6
箭头函数适合这种逻辑简单的场景,省去了手动写use的步骤。
这两种方法都能解决你遇到的作用域问题,不需要依赖面向对象知识,也避开了已弃用的create_function。
内容的提问来源于stack exchange,提问作者Arnaud
相关产品推荐
相关产品推荐

