请参阅下面的匿名函数,我不想在$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) {