2013-08-27 36 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當時不需要更改。

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