4.1 匿名函數與閉包
4.1.1 匿名函數與閉包的概念
匿名函數(Anonymous function),是指沒有名稱的函數。在一些調用參數為回調函數(callable)的函數里,如usort、preg_replace_callback、array_map等,如果定義的回調函數在其他地方不會用到,可以用匿名函數代替。例如將數組中的元素全部改為大寫的方式,第2~4行定義了一個匿名函數,將傳遞給它的參數轉換為大寫之后返回。

請注意,PHP文檔里關于匿名函數(http://php.net/manual/zh/functions.anonymous.php)的描述是有問題的:匿名函數(Anonymous functions),也叫閉包函數(closures),允許臨時創建一個沒有指定名稱的函數。
閉包函數不僅僅是匿名函數,還包括執行環境上下文。閉包是由函數和與其相關的引用環境組合而成的實體。
閉包可以將功能實現封裝在一塊代碼內,避免使用全局變量和函數定義。例如下例將數組中的數字變為平方。注意普通函數和閉包的實現都可以完成功能,但普通函數實現的方式引入了函數square,這是一個全局的函數,在大型或多人合作項目中,不能再定義名稱為square的函數了(此處不考慮命名空間)。以免為了一個一次性的功能,“污染”了全局空間。
(源碼文件:ch04/closure/function_vs_closure.php)

4.1.2 匿名函數里的變量作用域
匿名函數之外的變量對匿名函數來說是不可見的,這并不稀奇,因為匿名函數屬于函數的一種,而函數里的變量,其作用域局限在函數本身。如果需要訪問外部變量有以下兩種方法:
● 使用use關鍵字。
● 可以使用global全局變量,但不建議使用。閉包的作用就是要減少全局變量的使用。
請看以下示例:
(源碼文件:ch04/anonymous_function.php)

4.1.3 面試題:匿名函數中$this的使用
題目描述:匿名函數里能用$this嗎?
解答:在5.3版本中不可以,之后的版本(5.4+,7.0+)都可以。
示例代碼如下:(源碼文件:ch04/anonymous_function_this.php)

4.1.4 面試題:閉包是什么
解答:這是一個比較開放的問題,如果直接答閉包就是匿名函數,顯得有些敷衍。可以從閉包的定義、使用場景、變量的作用域、使用外部變量等方面作答,以下是參考答案。
閉包是由函數和與其相關的引用環境組合而成的實體,它有兩個必不可少的元素:函數和執行環境上下文。閉包的作用是將一個功能實現封閉到一塊代碼之內,以減少全局變量和函數定義。閉包可以在回調參數和迭代器里使用,處理完回調或迭代之后,不會影響到程序的其他部分。閉包之外的變量對閉包而言是不可見的,如果要使用外部變量,建議使用use關鍵字。