微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

$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])};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。