2017-10-06 17 views
0

コールバック関数を実行するスケジューラを構築していて、その関数を所定の時間だけ、所定の遅延量の間に実行します。以下は、機能がどのように見えるかについてのインターフェースです。PHP Objectメソッド内からコールバック関数を呼び出す

サイドノート私はLaravel Frameworkを使用しています。

public function testBasicTest() 
{ 
    $count = 0; 
    $schedule = new NodeScheduler(); 
    $schedule->retries(2)->delay(100000)->do(function() use ($count) { 
     $count++; 
    }); 
    $this->assertEquals($count === 1); 
} 

これは、機能のこの作品のために私のテストであり、あなたが見ることができるように私はそれの終わりで2に等しくなるようにカウントします。

私のクラスは次のようになります。

class NodeScheduler 
{ 
    protected $retries = 1; 
    protected $milliseconds = 10000; 

    public function __construct() 
    { 
     return $this; 
    } 

    public function retries($numberOfRetries) 
    { 
     $this->retries = $numberOfRetries; 
     return $this; 
    } 

    public function delay($milliSeconds) 
    { 
     $this->milliSeconds = $milliSeconds; 
     return $this; 
    } 

    public function do($callback) 
    { 
     for($i = 0; $i < $this->retries; $i++){ 
      $callback(); // <<<<<< How Do I Inject The $count Variable Here? 
      usleep($this->milliseconds); 
     } 
     return; 
    } 
} 

私のテストはして失敗します。

Failed asserting that 2 matches expected 0. 

不思議なことに、私は$カウントが定義されていません得ることはありません。私は近いと思う

、任意のヘルプは大幅に

+0

あなたは '$ this-> assertEquals(1、$ count);と書いておきたいと思います。 ' – Arno

答えて

1

あなたuse()関数内、外側のスコープからの変数は、この関数の内部スコープに変数のコピーを作成します(あなたがuse()オブジェクトをINGのだ場合は例外です)。

あなたは外側のスコープから変数をインポートし、、それを変更したい場合は、参照することによってそれを渡す必要があります:

$schedule->retries(2)->delay(100000)->do(function() use (&$count) { 
    $count++; 
}); 

編集:また、どのような@Arnoと@ Oniyoは指摘しました:assertEquals(1, $count)を使用するか、またはassertTrue($count === 1)を入力してください。

+0

私は参照渡しについては全く知らなかった、ありがとう –

0

に感謝し、私はあなたが間違った二つのことをやっていると思う

まず:@Arnoとしては第二に、

$this->assertEquals($expected, $actual); 

を指摘:をあなたのコードに見られるものから、ループは$this->retriesの反復を実行します。だから、$this->assertEquals($expected, $actual)

$this->assertEquals(2, count); 

幸運の男でなければなりません!

関連する問題