关于PHP函数前面加&

看到项目里大佬写的加载类的单例模式

function &load()
{
    static $class = null;
    if($class){
        return $class;
    }
    $class = new Class();
    return $class;
}

一直不明白函数前边加&是做什么的,在网上差了好多,举的例子太乱,也没搞明白,自己亲自试了一下,现在做个总结。

首先,我们要先理解函数内部的static关键字,这个关键字是声明class变量为全局变量,即使函数调用结束,回收栈内存时也不会将该变量回收,所以第二次进来的时候class变量已经存在了,所以不需要重新new,单例模式。

当函数定义时,名字前边加&符,并且在调用时也加&,注意,调用时也要加,则可以返回变量的地址,所以在函数外部改变该返回值对应的变量时,相当于更改了全局的static变量。

函数不加&

function incr($trun = false)
{
    static $a = 0;
    $a += 1;
    if($trun){
        echo $a . "\n";
    }
    return $a;
}
$a = incr();
echo $a . "\n";
$a  = 10;
incr(true);
echo $a;
[Running] php "/Users/why/Desktop/php/why.php"
1
2
10

[Done] exited with code=0 in 0.321 seconds

函数加&,调用不加&

function &incr($trun = false)
{
    static $a = 0;
    $a += 1;
    if($trun){
        echo $a . "\n";
    }
    return $a;
}
$a = incr();
echo $a . "\n";
$a  = 10;
incr(true);
echo $a;
[Running] php "/Users/why/Desktop/php/why.php"
1
2
10
[Done] exited with code=0 in 0.327 seconds

函数定义加&,调用也加&

function &incr($trun = false)
{
    static $a = 0;
    $a += 1;
    if($trun){
        echo $a . "\n";
    }
    return $a;
}
$a = &incr();
echo $a . "\n";
$a  = 10;
incr(true);
echo $a;
[Running] php "/Users/why/Desktop/php/why.php"
1
11
11
[Done] exited with code=0 in 0.351 seconds

在定义和调用都加&时,我们在函数外边更改a变量时,实际上时更改的static定义都全局a变量,所以第二次进入的时候我们的a变量已经在外部更改成10了,所以+1结果为11,并且外边最后输出$a也是11。

扫描二维码关注公众号,回复: 9479614 查看本文章
发布了226 篇原创文章 · 获赞 31 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/why444216978/article/details/104500412