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