2012-07-21 135 views
5

我想了解關於closure類,在手動存在, 所有在手動LinkPHP,封閉類

閉幕:: __構建 - 該構造不允許實例化。如果我理解正確,這個類的唯一實例是匿名函數變量賦值。

,但我不明白的幾行:

閉幕::綁定 - 直接複製與特定的綁定對象和類作用域的關閉。

Closure :: bindTo - 用新的綁定對象和類作用域複製閉包。

,並在手冊我不明白這句話的最後一個:

除了這裏列出的方法,這個類也有一個__invoke 方法。這是爲了與實現 調用魔術的其他類一致,因爲此方法不用於調用該函數。

如果有人可以嘗試解釋thoes行給我我會非常感激,祝你有美好的一天。

+0

謝謝大家,我正在閱讀答案。 – 2012-07-21 12:58:12

回答

7

它指的是calling magic

據我所知,對於任何包含方法__invoke的類,它的實例可以被調用,就像它是一個函數一樣。 Closure::__invoke的行爲就像那樣。

即當$fooClosure類(匿名函數),稱$foo($bar)將調用$foo->__invoke(bar)(雖然__invoke成員並不意味着直接調用,這只是爲了顯示它是如何工作)。

當你定義匿名函數,你這樣做:現在

$greet = function($name) 
{ 
    printf("Hello %s\r\n", $name); 
}; 

$greetClosure類的。 $greet->__invoke等於function($name){ printf("Hello %s\r\n", $name); }

並且記住,Closure::__invoke是​​。

+0

謝謝Alvin Wong爲你解釋有關__invoke魔法的解釋我現在也知道另一種魔法,我可以在OOP中使用魔法,所以謝謝你,祝你有美好的一天。 – 2012-07-21 13:08:53

3

我覺得bindbindTo之間的區別僅僅是在他們的調用方式:

$cl->bindTo($obj) 

相當於

Closure::bind($cl, $obj) 

關於__invoke meethod,它說,該方法存在,但它並未實際使用。當您將閉包作爲函數使用時,會使用繞過該方法的內部(可能更高效)的機制。但該方法與其他可調用類兼容,如果需要,可以手動調用它。

+0

謝謝巴爾馬可以請你多展開一下關於bind和bindTo因爲我不知道如果我能夠比較bindTo並且綁定到一個代碼,我是否有這個權利。 – 2012-07-21 13:06:51

+0

as [this](http://www.php.net/manual/en/closure.bind.php)指出'此方法是Closure :: bindTo()的靜態版本'' – 2012-07-21 13:40:51

+0

查看示例文檔。我不認爲我能做得比這更好。它們只是編寫完全相同的兩種不同的方式 - bindTo是面向對象的,而bind是傳統的函數風格。 – Barmar 2012-07-23 06:55:57