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



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

$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})也不起作用。

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

$color = ${strtoupper($colors[$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");

最新更新