在PHP中,匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。
匿名函数目前是通过 Closure 类来实现的。(摘自官方文档)
1、简单示例
定义一个函数,并没有指定名称,再指定一个参数
1 $fun = function ($variable) { 2 echo $variable . '---'; 3 }; 4 $a = '123'; //变量$a定义在匿名函数定义前,还是后,结果是一样的
5 $fun($a); 6 // 运行结果为: 123---
2、未使用 use
如果不使用use ,则不能在匿名函数中调用变量$b。
1 $b = '456'; 2 $fun = function ($variable) { 3 echo $variable .'---'. $b; 4 }; 5 $a = '123'; 6 $fun($a); 7 // 输出结果为 ErrorException 未定义变量 b
3、使用use
借助关键字use之后,就可以调用变量$b了
1 $a = '123'; 2 $b = '456';// 此时,变量$b必须定义在匿名函数定义前
3 $fun = function ($variable) use($b) { 4 echo $variable .'---'. $b; 5 }; 6 $fun($a); 7 // 输出结果是 123---456
前提是变量$b必须在匿名函数定义之前,否则依然会提示未定义变量 b
4、不使用&
1 $a = '123'; 2 $b = '456';// 此时,变量$b必须定义在匿名函数定义前
3 $fun = function ($variable) use($b) { 4 echo $variable .'---'. $b; 5 }; 6 $fun($a); 7 // 输出结果是 123---456
8 $b = 5678; 9 $fun($a); 10 // 输出结果依然是 123---456
示例4中,虽然修改了变量b的值,但是结果依然是123—456,因为匿名函数在定义时已经保存了变量b的值,这也是证明了为何$b必须定义在匿名函数定义之前的原因了,因为在定义时,会保存这个值,如果要想随着外界修改而自动更新,则就使用引用传递了,即&
5、使用&
1 $a = '123'; 2 $b = '456'; 3 $fun = function ($variable) use(&$b) { 4 echo $variable .'---'. $b; 5 }; 6 $fun($a); 7 // 输出结果是 123---456
8 $b = 5678; 9 $fun($a); 10 // 输出结果变为 123---5678
备注:以上调试php版本是7.3.4