PHP面试一战到底
上QQ阅读APP看书,第一时间看更新

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关键字。