以下代码是我想要理解的简化示例。
我正在使用一个使用回调来处理多个请求的外部库。最后,我一直试图弄清楚如何为每个数组元素调用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
获取答案 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));