匿名函数从包含变量的父作用域继承变量

Anonymous function inheriting variable from parent scope which contains variable

我试图在循环中声明匿名函数,但其​​中一个变量包含变量名。 这是我使用的代码:

$GREEN = "MY GREEN";
$RED = "MY RED";
$BLUE = "MY BLUE";
$colors = array( 'red', 'green', 'blue');
for ($i = 0; $i < count($colors); $i++)  {
    $color = strtoupper($colors[$i]);
     ${$colors[$i]} = function ($text) use ($color) {
          echo $text . " is " . $color . "\n";
      };
}
$green("HELLO");
$red("HELLO");
$blue("HELLO");

结果显示:

HELLO is GREEN
HELLO is RED
HELLO is BLUE

但我希望它显示:

HELLO is MY GREEN
HELLO is MY RED
HELLO is MY BLUE

我无法在 PHP 中完成它。显然use ($color)不是我需要的,但是use (${$color})也不行。

如果您想使用顶部的变量,您也需要包含它们。

这是您的代码,改动很少。我将变量收集到一个数组中以便于使用,同时也避免了很大的 use 列表。

$my_colors = [
  'GREEN' => "MY GREEN",
  'RED'=> "MY RED",
  'BLUE' => "MY BLUE"
];
$colors = array( 'red', 'green', 'blue');
for ($i = 0; $i < count($colors); $i++)  {
    $color = strtoupper($colors[$i]);
     ${$colors[$i]} = function ($text) use ($color, $my_colors) {
          echo $text . " is " . $my_colors[$color] . "\n";
      };
}
$green("HELLO");
$red("HELLO");
$blue("HELLO");

虽然我不是可变变量的粉丝并且更喜欢数组,但是你可以在将颜色传递给函数之前解决这个问题...

$color = ${strtoupper($colors[$i])};