匿名函数和循环问题


Anonymous function and loop issue

请参阅下面的匿名函数,我不想在$Connected为 0 之前转到下一个循环迭代for

它没有按照应有的方式工作... 解决此问题的解决方案是什么?

 $Client = new Client();
for ($i = 1; $i <= 5; $i++) {
 $result = $Client->Action(rand(1,1000));
 if ($result->isSuccess()) {
     $Connected = 1;
  }
  // Stay in the loop until 'HangupEvent' received
  while ($Connected) {
    $Client->EventListener(function (EventMessage $event) {
        if ($event instanceof HangupEvent) {
            // Received Hangup Event - let terminate this while loop ..
            $Connected = 0;
         }
    });
   // If  $Connected = 0; then go to next `for` loop iteration
  }
}
您需要

使用 use 将 $Connected 变量传递给您的函数

$Client->EventListener(function (EventMessage $event) use (&$Connected) {
    if ($event instanceof HangupEvent) {
        // Received Hangup Event - let terminate this while loop ..
        $Connected = 0;
     }
});

正如其他人所说,正如文档中所示,为了修改闭包内变量的值,您必须使用 use (&$Conntected) 传递它。但你必须改变更多。

while循环将被执行,直到$Connected 1,这意味着您最终会向客户端添加许多事件处理程序......这不是你想要的。

现在,我不知道 PHP 如何处理这些事件回调(或并发函数调用),但我认为您需要的是sleep

$Client->EventListener(function (EventMessage $event) use (&$Conntected) {
    if ($event instanceof HangupEvent) {
        // Received Hangup Event - let terminate this while loop ..
        $Connected = false;
     }
});
while($Connected) {
    sleep(500); // delay execution for 500 milliseconds, then check again
}

PHP 处理闭包的方式与其他语言不同。您必须明确声明要关闭的变量。你可以在这里阅读它: http://php.net/manual/en/functions.anonymous.php

尝试 $Client->EventListener(function(EventMessage $event) use (&$Connected) {