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
相关产品推荐
相关产品推荐

