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

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

调用函数 usingcall_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 回答