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

Php 从包含变量的父作用域继承变量的匿名函数,php,anonymous-function,Php,Anonymous Function,我试图在循环中声明匿名函数,但其中一个变量包含变量名。 这是我正在使用的代码: $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]

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

$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 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");
$my_colors=[
“绿色”=>“我的绿色”,
“红色”=>“我的红色”,
“蓝色”=>“我的蓝色”
];
$colors=数组('red'、'green'、'blue');
对于($i=0;$i
如果要使用顶部的变量,还需要包含它们

这是您的代码,改动最小。我将变量收集到一个数组中,以便于使用,并避免出现一个大的
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");
$my_colors=[
“绿色”=>“我的绿色”,
“红色”=>“我的红色”,
“蓝色”=>“我的蓝色”
];
$colors=数组('red'、'green'、'blue');
对于($i=0;$i
虽然我不喜欢变量,更喜欢数组,但在将颜色传递给函数之前,您可以解决这个问题

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

虽然我不喜欢变量和数组,但你可以在把颜色传递给函数之前解决这个问题

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

谢谢你,吉尔。这是一个很好的方法,我在其他答案中也看到过,但颜色只是一个例子。我需要生成许多函数,而仅仅为了一个简单的任务,传递一个数组的开销似乎很大。谢谢Gil。这是一个很好的方法,我在其他答案中也看到过,但颜色只是一个例子。我需要生成许多函数,而传递一个数组对于一个简单的任务来说似乎开销很大。谢谢Nigel。正是我需要的。我尝试了几种方法,但现在我明白了这是多么简单。顺便说一句,我不能接受这个答案,不知道为什么。谢谢奈杰尔。正是我需要的。我尝试了几种方法,但现在我明白了这是多么简单。顺便说一句,我不能接受这个答案,不知道为什么。