2014-07-17 76 views
0

某處在我__call魔術方法我調用transactional,接受Closure在php中返回Closure的結果?

try { 
    $that = $this 
    $this->conn->transactional(function ($conn) use ($that, $realMethod) { 
     $result = call_user_func([$that, $realMethod], $conn); 
     $this->conn->exec('SET foreign_key_checks = 1'); 
    }); 
} catch (\Exception $e) { 
    $this->conn->exec('SET foreign_key_checks = 1'); 

    throw $e; 
} 

有沒有辦法從返回$result瓶蓋內(或使用通過引用傳遞,等等)?

方法$conn->transactional不是我的控制之下

public function transactional(Closure $func) 
{ 
    $this->beginTransaction(); 
    try { 
     $func($this); 
     $this->commit(); 
    } catch (Exception $e) { 
     $this->rollback(); 
     throw $e; 
    } 
} 

回答

2

肯定有 - 創建try塊中的局部變量,並通過引用捕捉它:

$result = null; 
$that = $this; 
$this->conn->transactional(function ($conn) use ($that, $realMethod, &$result) { 
    $result = call_user_func([$that, $realMethod], $conn); 
    $this->conn->exec('SET foreign_key_checks = 1'); 
}); 

return $result; 

當然這一點假設transactional將在現場提出它的論點,因爲事實確實如此,我們都可以開心。

+0

發佈問題後馬上找出來。由於一些奇怪的原因,PHPStorm給了我一個錯誤,讓我覺得這是不可能的。謝謝!!! – gremo