您现在的位置是:首页 > 文章详情  网站首页文章详情

PHP匿名函数、闭包、function-use

  • Administrator
  • 1086
  • 2020-04-24 10:11:09
  • PHP语言
简介匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它...

匿名函数(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

文章评论

Top