PHP 匿名函数使用

一、普通用法

$anonymous_fun = function () {
    echo "匿名函数调用";
};
$anonymous_fun();

二、匿名函数传参

$anonymous_fun = function ($parameter) {
    echo "匿名函数调用,参数值为:$parameter";
};
$anonymous_fun("apple");

三、匿名引用函数(返回引用变量)、引用传参

$quote = 'first';
$anonymous_fun = function &(&$parameter) {
    $parameter = 'second';
    return $parameter;
};
$res_quote = &$anonymous_fun($quote); // 注意调用函数前添加&
$res_quote = 'third';
echo "初值->匿名引用函数内修改->函数返回引用变量的修改:$quote";

输出:初值->匿名引用函数内修改->返回引用变量的修改:third

四、通过use,使用外部变量

例1:外部变量,在匿名函数定义之前

$out_val = 'abc';
$anonymous_fun = function () use ($out_val) {
    echo "匿名函数调用,use参数值为:$out_val";
};
$anonymous_fun();

例2:外部变量,在匿名函数定义之后(引用变量方式)

// &$out_val传的是$out_val的存储地址,而非变量的值,因此在下文修改的变量值也可以被读取到。
$anonymous_fun = function () use (&$out_val) {
    echo "匿名函数调用,use参数值为:$out_val";
};

$out_val = 'abc';

$anonymous_fun();

注:非引用变量传的是值本身,在use定义时已单独存储,之后无法再通过原变量来进行修改。

$a = 5;
$b = function ($x) use ($a) { // use此时传变量的值,而值不会改变。类似不传参数时的默认值
$a += $x; echo $a;
};
$a = 10; // 这个变量被再次赋值, 但是在use语句中变量的'快照'是不会改变的
$b(100); // 输出 : 105
$a = 5;
$b = function ($x) use (&$a) { // use传变量的存储地址,之后只是存储地址不会再变。
$a += $x; echo $a;
};
$a = 10; // 变量重新赋值(use所传引用变量的变量地址-对应的值也被改变)
$b(100); // 输出 : 110

注(个人猜测):use传引用变量只是传的存储地址,匿名函数内使用了新的变量“符号即symbol”,因此匿名函数内部无法修改传入的引用变量的存储地址(无法修改旧“符号即symbol”指向的存储地址)

$a = 'a的原始值';
$out_val = 'out_val的原始值';
$anonymous_fun = function () use ($a, &$out_val) {
    echo "匿名函数内-><br />";
    $out_val = &$a;
    echo '匿名函数内修改变量的存储地址(仅函数内有效)打印:$out_val-> ' . $out_val . '<br />';
};
$anonymous_fun();
echo "匿名函数执行后-><br />";
echo '打印:$out_val: '.$out_val . '<br />';
echo '打印:$a: '.$a . '<br />';

五、匿名函数定义后,立即执行:

方法1:(此方法可能只在php version >= 7 时才可用。)

(function () {echo "立即执行";})();

方法2:

call_user_func(function () {echo "立即执行";});

相关参考:
php 使用use 和直接传参的区别()
如何在 PHP 中立即执行匿名函数?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值