为了账号安全,请及时绑定邮箱和手机立即绑定

从闭包内部更新全局范围内的变量值

从闭包内部更新全局范围内的变量值

PHP
蓝山帝景 2023-11-04 21:00:41
我试图并行地对我的数据库对象执行一些处理(things),我使用这个包并行运行事物https://github.com/spatie/async我想知道我的事情有多少已经被成功处理,所以我$stats在全局范围内定义了数组并尝试从内部更新它   $pool   = Pool::create();    $things = Thing::all();    $stats = [        'total'   => count($things) ,        'success' => [] ,    ];    foreach ($things as $thing) {        $pool->add(function () use ($thing , $stats ) {            // do stuff             return [$thing , $stats]  ;        })->then(function ($output ) {            // Handle success            list( $thing  , $stats) = $output ;            dump('SUCCESS');            $stats['success'][$thing->id] = $thing->id ;        }) ->catch(function ($exception){            // Handle exception            dump('[ERROR] -> ' . $exception->getMessage());        });    }    $pool->wait();    dump($stats);即使我在输出中看到成功,但当我转储时,$stats最后success总是空的array:3 [▼  "total" => 3  "success" => []]我也尝试过,stats但then没有use 什么区别})->then(function ($output ) use ($stats) 当我转储$stats到里面时then,我可以看到数据工作正常    })->then(function ($output ) {        // Handle success        list( $thing  , $stats) = $output ;        dump('SUCCESS');        $stats['success'][$thing->id] = $thing->id ;                dump( $stats);    })内部转储的输出thenarray:3 [▼  "total" => 3  "success" => array:1 [▼    2 => 2  ]]
查看完整描述

1 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

您需要做几件事:

$stats通过引用从父作用域继承,在第一个回调上使用以下内容:

use ($thing, &$stats)

然后返回相同的变量作为引用:

return [$thing, &$stats];

最后,$output在下一个回调中也通过引用取消引用相应的数组:

list($thing, &$stats) = $output;  // or [$thing, &$stats] = $output;

注意:这看起来有点粗略,我不确定这是使用这个库的正确方法,但这至少应该有效。


查看完整回答
反对 回复 2023-11-04
  • 1 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信