![PHP面试一战到底](https://wfqqreader-1252317822.image.myqcloud.com/cover/891/44509891/b_44509891.jpg)
4.1 匿名函数与闭包
4.1.1 匿名函数与闭包的概念
匿名函数(Anonymous function),是指没有名称的函数。在一些调用参数为回调函数(callable)的函数里,如usort、preg_replace_callback、array_map等,如果定义的回调函数在其他地方不会用到,可以用匿名函数代替。例如将数组中的元素全部改为大写的方式,第2~4行定义了一个匿名函数,将传递给它的参数转换为大写之后返回。
![](https://epubservercos.yuewen.com/9146EB/23721566801954006/epubprivate/OEBPS/Images/Figure-P65_39685.jpg?sign=1738873791-6pcXs7SqS0PvO4bVte2o7kSLpEFx0zfF-0-2e12676a241d82a8281b0509a92abde7)
请注意,PHP文档里关于匿名函数(http://php.net/manual/zh/functions.anonymous.php)的描述是有问题的:匿名函数(Anonymous functions),也叫闭包函数(closures),允许临时创建一个没有指定名称的函数。
闭包函数不仅仅是匿名函数,还包括执行环境上下文。闭包是由函数和与其相关的引用环境组合而成的实体。
闭包可以将功能实现封装在一块代码内,避免使用全局变量和函数定义。例如下例将数组中的数字变为平方。注意普通函数和闭包的实现都可以完成功能,但普通函数实现的方式引入了函数square,这是一个全局的函数,在大型或多人合作项目中,不能再定义名称为square的函数了(此处不考虑命名空间)。以免为了一个一次性的功能,“污染”了全局空间。
(源码文件:ch04/closure/function_vs_closure.php)
![](https://epubservercos.yuewen.com/9146EB/23721566801954006/epubprivate/OEBPS/Images/Figure-P66_39686.jpg?sign=1738873791-9tDyXr8AbPCyI5mkjJMyCFmqwDSKdcJQ-0-b3b9c0206d94545fcbad0deb02639927)
4.1.2 匿名函数里的变量作用域
匿名函数之外的变量对匿名函数来说是不可见的,这并不稀奇,因为匿名函数属于函数的一种,而函数里的变量,其作用域局限在函数本身。如果需要访问外部变量有以下两种方法:
● 使用use关键字。
● 可以使用global全局变量,但不建议使用。闭包的作用就是要减少全局变量的使用。
请看以下示例:
(源码文件:ch04/anonymous_function.php)
![](https://epubservercos.yuewen.com/9146EB/23721566801954006/epubprivate/OEBPS/Images/Figure-P66_39691.jpg?sign=1738873791-AXKLZMt5TxoHrbWxTA2hMV1402u080S8-0-2bafacb98347640ca952a2200d1a8d51)
4.1.3 面试题:匿名函数中$this的使用
题目描述:匿名函数里能用$this吗?
解答:在5.3版本中不可以,之后的版本(5.4+,7.0+)都可以。
示例代码如下:(源码文件:ch04/anonymous_function_this.php)
![](https://epubservercos.yuewen.com/9146EB/23721566801954006/epubprivate/OEBPS/Images/Figure-P67_39693.jpg?sign=1738873791-Pd6HvaqQRpmobtig7liIhTp7sNrmmBh5-0-4d5dc667f641a60778223840d5f4ae05)
4.1.4 面试题:闭包是什么
解答:这是一个比较开放的问题,如果直接答闭包就是匿名函数,显得有些敷衍。可以从闭包的定义、使用场景、变量的作用域、使用外部变量等方面作答,以下是参考答案。
闭包是由函数和与其相关的引用环境组合而成的实体,它有两个必不可少的元素:函数和执行环境上下文。闭包的作用是将一个功能实现封闭到一块代码之内,以减少全局变量和函数定义。闭包可以在回调参数和迭代器里使用,处理完回调或迭代之后,不会影响到程序的其他部分。闭包之外的变量对闭包而言是不可见的,如果要使用外部变量,建议使用use关键字。