概述
闭包和匿名函数在PHP 5.3.0中引入,这两个特性非常有用,每个PHP开发者都应该掌握。
匿名函数其实就是没有名称的函数,匿名函数可以赋值给变量,还能像其他任何PHP函数对象那样传递。不过匿名函数仍然是函数,因此可以调用,还可以传入参数,适合作为函数或方法的回调。
闭包是指在创建时封装周围状态的函数,即使闭包所在的环境的不存在了,闭包中封装的状态依然存在。
创建匿名函数
创建匿名函数很简单:
//将匿名函数赋给一个变量,通过变量名+()的形式来调用 $greet = function () { return "Hello World"; }; echo $greet();
结果打印:
Hello World
匿名函数和普通的PHP函数很像:常用的句法相同,也接受参数,而且能返回值。不过闭包没有函数名。
注:我们之所以能调用$greet
变量,是因为这个变量的值是一个闭包,而且闭包对象实现了__invoke()
魔术方法,只要变量名后有(),PHP就会查找并调用__invoke
方法。
我们通常把匿名函数当做函数或方法的回调使用,事实上,很多PHP函数都会用到匿名函数,比如array_map
和preg_replace_callback
,这是使用PHP匿名函数的绝佳时机。记住,闭包和其他值一样,可以作为参数传入其他PHP函数:
$numberPlusOne = array_map(function ($number) { return $number += 1; }, [1, 2, 3]); print_r($numberPlusOne);
在匿名函数出现之前,要实现这样的功能,PHP开发者只能单独创建具名函数,然后使用名称引用这个函数:
function incrementNumber ($number) { return $number += 1; } $numberPlusOne = array_map(‘incrementNumber', [1, 2, 3]); print_r($numberPlusOne);
这样做把回调的实现和使用场所隔离开了,而且使用闭包实现代码更加简洁。
创建闭包
包含自由变量的函数与为所有这些自由变量提供了变量绑定的环境一起,被称为闭包。
function makeHelloWorld($name) { $i = 0; return function()use($name, &$i){ echo $name.$i. ' <br>'; $i++; }; } $hello1 = makeHelloWorld("itbsl"); $hello2 = makeHelloWorld("kevin"); $hello1(); $hello1(); $hello1(); $hello2();
打印结果:
itbsl0
itbsl1
itbsl2
kevin0
从父作用域继承变量
在PHP中必须手动调用闭包对象的