You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中React Promise内部如何访问外部定义变量(DiscordPHP开发场景)

问题原因

你的代码中global关键字无法获取到$message的根本原因是:$message是foreach循环内的局部作用域变量,并不属于全局作用域,因此global声明完全不生效。
PHP的匿名函数默认无法直接访问父级作用域的变量,需要通过use关键字显式声明要继承的变量。


修正方案

只需要给done方法的回调函数加上use声明导入当前迭代的$message变量即可,这里也同步优化了外层回调的变量导入逻辑,用use替代global避免全局变量污染,修改后的完整代码如下:

$messages = [];
$messages['123'] = [ "Hello", "World" ];

if (count($messages) > 0) {
    $discord = new Discord([
        'token' => '<discord token>',
    ]);

    $discord->on('ready', function ($discord) use ($messages) {
        foreach ($messages as $discordid=>$message) {
            $user = $discord->users->fetch($discordid, false)
                    ->done(
                        function($user) use ($message) {
                            $ret = $user->sendMessage("This is a sample message.\n".implode("\n", $message));
                        }
                    );
        }
    });

    $discord->run();
}

补充说明

  • use默认是值拷贝,每次循环迭代都会把当前的$message值复制到闭包内,不会出现所有闭包都取到最后一次循环值的问题
  • 如果你需要在闭包内修改外部变量,才需要在变量前加&符号声明为引用传递,当前场景不需要引用

内容的提问来源于stack exchange,提问作者Shahid Thaika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:27:04