一旦线程运行完毕,我正在尝试使用闭包作为回调。但是我遇到了似乎是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();
但是一旦我从Thread派生Test,运行脚本就会出错:
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 :(得分:1)
Zend不允许您序列化闭包对象。
所以这不是你应该尝试解决的问题,可能在将来的某个时候Zend将允许闭包的序列化,pthreads当时不需要更改。
你只需要用老式的方式来做......