1

次のコードは、私が理解しようとしていることの簡単な例です。

コールバックを使用して複数のリクエストを処理する外部ライブラリを使用しています。最終的には、各配列要素をTest->inc()呼び出す方法を理解しExternalLib、すべてのコールバックが実行されるのを待ってから続行する方法を模索してきました。

ご覧のとおり、18行目の致命的なエラーは、を介して呼び出されたメソッドが原因call_user_funcです。どうすればこれを行うことができますか、またはおそらくより良い方法がありますか?

class Test {
    public $a = array();

    public function inc(array $ints){
        $request = new ExternalLib();
        foreach ($ints as $int) {
            $request->increment($int);
        }

        while( count($this->a) < count($ints) ) {
            usleep(500000);
        }

        $test->dump();
    }

    public function incCallback($in, $out) {
        /* append data to Test class array */
        $this->a[] = array($in => out); /* Fatal error: Using $this when not in object context */
    }

    public function dump() {
        /* Print to screen */
        var_dump($this->a);
    }
}


class ExternalLib {
    /* This library's code should not be altered */
    public function increment($num) {
        call_user_func(array('Test','incCallback'), $num, $num++);
   }
}


$test = new Test();
$test->inc(array(5,6,9));

必要な出力:

array(3) {
  [5]=>
  int(6)
  [6]=>
  int(7)
  [9]=>
  int(10)
}

このコードはコードパッドでも入手できます

4

1 に答える 1

3

問題はタイミング/待機の問題ではありません。これは静的な問題とインスタンス化された問題です。

を使用して関数を呼び出すことcall_user_func(array('Test','incCallback')...は、を呼び出すことと同じTest::incCallbackです。$this静的呼び出しを行う場合は使用できません。

インスタンス化されたオブジェクトを使用するように外部ライブラリを変更するか、すべての静的データを使用するようにTestクラスを変更する必要があります。

編集

あなたが何を達成しようとしているのか正確にはわかりませんが、クラスを静的クラスとして動作させることが唯一の選択肢である場合は、それがあなたがしなければならないことです...

コードには他にもいくつか問題があります。

  • 必要な出力に基づいて、必要ではなくa[] = array($in, $out)、むしろa[$in] = $out
  • $num++関数が呼び出されるまで増分しません...必要な++$num

これが実際の例です...

class Test {
    public static $a;

    public function inc(array $ints){
        $request = new ExternalLib();
        foreach ($ints as $int) {
            $request->incriment($int);
        }

        while( count(self::$a) < count($ints) ) {}

        self::dump();
    }

    public function incCallback($in, $out) {
        /* append data to Test class array */
        self::$a[$in] = $out;
    }

    public function dump() {
        /* Print to screen */
        var_dump(self::$a);
    }
}


class ExternalLib {
    /* This library's code should not be altered */
    public function incriment($num) {
        call_user_func(array('Test','incCallback'), $num, ++$num);
   }
}


Test::$a = array();
Test::inc(array(5,6,9));
于 2012-06-06T18:32:48.717 に答える