1

以下の無名関数を参照してください。0になるforまで、次のループ反復に進みたくありません。$Connected

本来あるべき姿で動作しませんでした...これを修正する解決策は何ですか?

 $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
  }

}
4

3 に答える 3

4

$Connected 変数を関数に渡す必要がありますuse

$Client->EventListener(function (EventMessage $event) use (&$Connected) {
    if ($event instanceof HangupEvent) {
        // Received Hangup Event - let terminate this while loop ..
        $Connected = 0;
     }
});
于 2012-05-10T12:32:20.493 に答える
1

他の人が言ったように、ドキュメントに示されているように、クロージャー内の変数の値を変更するには、を使用して渡す必要がありますuse (&$Conntected)。しかし、それ以上に変わらなければなりません。

whileループは is まで実行され$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
}
于 2012-05-10T12:42:25.247 に答える
0

PHP は、他の言語とは異なる方法でクロージャを処理します。どの変数を閉じるかを具体的に宣言する必要があります。ここでそれについて読むことができます: http://php.net/manual/en/functions.anonymous.php

$Client->EventListener(function(EventMessage $event) use (&$Connected) { を試してください。

于 2012-05-10T12:36:43.460 に答える