2013-05-28 45 views
1

最近我遇到了以下問題。這是發生問題的簡單例子。__invoke對象引用丟失行爲

class a{ 
    public function __invoke($classname){ 
     return new $classname($this); 
    } 
} 
class b{ 
    private $obj; 
    public function __construct($obj){ 
     $this->obj = $obj; 
    } 
    public function getC(){ 
     return $this->obj('c'); 
    } 
} 
class c{} 

$a = new a; 
$a('b')->getC(); 

當我執行這個代碼,我得到以下錯誤

Fatal error: Call to undefined method b::obj()

看來__invoke的行爲失去了對對象的引用在此行

return $this->obj('c'); 

它實際上不對我來說這個大問題,因爲我可以這樣做

return $this->obj->__invoke('c'); 

..但我真的很想知道爲什麼__invoke在這裏無法按預期工作。任何人都可以解釋我嗎?提前致謝!

回答

2

我的猜測是,這是因爲PHP中的函數和對象仍然沒有得到相當的對待(即使最近的PHP版本試圖解決這個問題)。我懷疑有一種語言限制不允許$this->obj()中的obj作爲對象處理(因爲該語法通常會引用方法),因此它僅檢查該類所公開的方法。

我沒有測試,但是這可能工作:

​​

當然,理想情況下,$this->obj應該是作爲一個對象是否是類的字段或類定義的方法訪問。通過這種方式,語法中存在不明確的地方並不重要,因爲首先不需要區分,但PHP不能這樣工作!

+0

感謝您的答案,這實際上有效! – sofl