如何使方法等待外部调用的回调完成?

时间:2012-06-06 18:22:38

标签: php oop

以下代码是我想要理解的简化示例。

我正在使用一个使用回调来处理多个请求的外部库。最后,我一直试图弄清楚如何为每个数组元素调用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)
}

此代码也可在codepad

获取

1 个答案:

答案 0 :(得分:3)

问题不在于时间/等待问题。这是一个静态与实例化的问题。

使用call_user_func(array('Test','incCallback')...调用此函数与调用Test::incCallback相同。进行静态呼叫时,您无法使用$this

您将需要修改外部lib以使用实例化对象或修改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));