2013-08-27 104 views
0

我试图在线程完成运行后使用闭包作为回调。但是我遇到了似乎是PHP或pthread扩展的限制/失败。在线程中存储闭包失败

我的开发堆栈运行在Win7 x64上,使用PHP 5.5.3 x86 TS,pthread 0.44版本。

下面的代码工作:

class Test 
{ 
    public $callbackVar; 
} 

$test = new Test(); 

$callbackVar = function() 
{ 
    echo "Callback var invoked."; 
}; 

$test->callbackVar = $callbackVar; 
$test->callbackVar->__invoke(); 

但只要我得到来自线程测试,运行脚本提供了一个错误

class Test extends Thread 
{ 
    public $callbackVar; 
    public function run() { } 
} 

$test = new Test(); 

$callbackVar = function() 
{ 
    echo "Callback var invoked."; 
}; 

$test->callbackVar = $callbackVar; 
// assert() returns true 
assert($test->callbackVar === null); 
$test->callbackVar->__invoke(); 

利用随后的输出

Fatal error: Call to a member function __invoke() on a non-object 

任何人有过这个问题吗?任何可能的解决方法?如果可能,我宁愿不使用eval ...我已经尝试了许多解决方法,例如使用ReflectionFunction重新包装到另一个闭包中,...没有任何东西会削减它。

+0

你使用的是什么PHP版本? – MisterBla

+0

已更新的问题,忘记了那个... –

+0

我发了[3v4l](http://3v4l.org/RnEgH)的代码。在5.3和5.5.2之间没有错误。不知道发生了什么。 – MisterBla

回答

1

Zend不允许你序列化闭包对象。

因此,这不是您应该尝试解决的问题,可能在将来的某个时间,Zend将允许关闭系列化,pthreads当时不需要更改。

你只需要用老式的方式来做...