匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。
匿名函数目前是通过 Closure 类来实现的。
闭包函数也可以作为变量的值来使用。PHP 会自动把此种表达式转换成内置类 Closure 的对象实例。把一个 closure 对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号:
匿名函数变量赋值实例:
$abc = function($xyz){
return $xyz.'--';
};
echo $abc(456);
// 输出:456--
在未使用关键字use 时,PHP不能在匿名函数中调用所在代码上下文变量。
$def = '123';
$abc = function($xyz){
return $xyz.'--'.$def;
};
echo $abc(456);
// 出 Notice: Undefined variable
// 456--
使用关键字use时,PHP可以在调用匿名函数中调用所在代码上下文的变量
$def = '123';
$abc = function($xyz) use($def){
return $xyz.'--'.$def;
};
echo $abc(456);
如果此时我修改变量$def的值看下
$def = '123';
$abc = function($xyz) use($def){
return $xyz.'--'.$def;
};
echo $abc(456);
$def = '789';
echo $abc(456);
// 输出结果:456--123456--123
发现第二次并没有变化,是因为匿名函数可以保存所在代码块上下文的一些变量和值(即:闭包函数将会保存第一次继承的父作用域的变量和值),值传递只是传递继承父作用域中变量和值的一个副本。
如果想要匿名作用域的值随着外界的 改变而改变的话,可以使用引用赋值&。
$def = '123';
$abc = function($xyz) use(&$def){
return $xyz.'--'.$def;
};
echo $abc(456);
$def = '789';
echo $abc(456);
// 输出结果:456--123456--789