疑問
如果你在理解閉包函數的時候覺得比較費解,不如放一放,問自己一個問題:
物件導向程式設計語言對代碼的複用主要採用繼承來實現,那面向函數的代碼複用能力通過什麼來實現呢。
你可能第一時間想到的是 函數嵌套,就是通過獨立子函數來組織代碼。那類似PHP裡面的array_walk()、array_udiff()這些函數怎麼實現呢。是不是覺得,有了匿名函數,array_walk()、array_udiff()這兩個函數才可能得到這麼好的複用。
所以按照最基礎的理解來總結,我個人認為 閉包函數 的主要目的是為了 函數複用 而設計的,如果某個語言不支援閉包函數,那再函數複用的能力上就會差一些,但是通過類的面向介面來編程,也可以很好的複用代碼的,所以一切根源都是為了代碼複用。
之所以閉包函數這麼難理解,我覺得是網上太多文章根據閉包函數的能力做了很多各種各樣的例子,譬如怎麼不用寫for迴圈,怎麼動態給類添加函數,這些的確是閉包函數的能力之一,但是比不是閉包函數設計的根源,所以會誤導讀者,讓讀者更不瞭解閉包函數。更好的理解方式應該是逆過來,先瞭解為什麼需要閉包函數,閉包函數是怎麼工作的,然後在來理解閉包函數有哪些應用情境。
總的來理解,我以為,PHP裡面閉包函數是為了複用函數而設計的語言特性,類似javascript等具有面向函數的程式設計語言一樣,可以在閉包函數裡面訪問指定域的變數,在PHP裡使用use關鍵字來實現。 Closure
PHP具有面向函數的編程特性,但是也是物件導向程式設計語言,PHP 會自動把閉包函數轉換成內建類 Closure 的對象執行個體,依賴Closure 的對象執行個體又給閉包函數添加了更多的能力。
例如Closure 的兩個函數:
Closure::bind — 複製一個閉包,綁定指定的 this對象和類範圍。Closure::bindTo—複製當前閉包對象,綁定指定的 this對象和類範圍。 Closure::bindTo — 複製當前閉包對象,綁定指定的this對象和類範圍。
這兩個函數的文字描述好讓人費解,直白一點可以這樣理解,通過這兩個函數,可以指定閉包函數裡 $this 變數的指向,和指明閉包函數的範圍。
具體底層怎麼控制這個範圍就還沒時間去看,不過知道範圍的概念就好。
好了,瞭解了基本意圖就可以看看例子了,這方面例子太多,自己就不寫了:
http://blog.csdn.net/wuxing26jiayou/article/details/51067190
http://www.cnblogs.com/yjf512/archive/2012/10/29/2744702.html