在匿名函数内修改全局作用域变量。

155
我在尝试 PHP 中的匿名函数时发现它们似乎无法访问外部变量。 有没有什么方法可以解决这个问题?
示例:
$variable = "nothing";

functionName($someArgument, function() {
  $variable = "something";
});

echo $variable;  //output: "nothing"

这将输出“nothing”。匿名函数有办法访问$variable吗?

2个回答

369

是的,使用闭包

functionName($someArgument, function() use(&$variable) {
  $variable = "something";
});

请注意,在匿名函数的作用域之外修改$variable并检索修改后的值,必须在闭包中使用&引用它。


1
这是新的!这是在PHP 5.3中新的语法。 - gen_Eric
2
@Rocket 所以,公平地说,真正的匿名函数语法(而不是create_function())和use关键字在同一文档页面上被记录(糟糕地)。 - DaveRandom
7
对于可能不知道的人,简要说明一下:由于对象始终通过引用传递,因此在传递对象时可以省略&。同时,不要忘记进行类型提示 :) 例如:function() use (PDO $pdo) { - keyboardSmasher
@Alliswell 不是的,它只适用于对象,否则你需要通过引用传递来修改变量。请参见此示例 - nickb

6

如果你的函数很短并且只有一行,你可以使用箭头函数,在PHP 7.4中可用:

$variable = "nothing";
functionName($someArgument, fn() => $variable = "something");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接