看到项目里大佬写的加载类的单例模式
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 查看本文章
![](/qrcode.jpg)