变量引用
我们可以知道在PHP中,变量以 $ 符号开头,其后是变量的名称。变量可以对一个内容进行引用,PHP 的引用允许你用两个变量来指向同一个内容 。
示例代码如下:
<?php
$a = 1;
$b = $a;
echo '$a ='.$a.'; '.'$b = '.$b."\n".
$b = 2;
echo '$a ='.$a.'; '.'$b = '.$b."\n".
输出结果:
$a = 1; $b = 1;
$a = 1; $b = 2;
$a将值赋给了$b,拷贝一份右边的变量给b,会生成一份内存空间,结果可能是同样的内容在内存中两份。此时变量a与变量b同时指向同一个内容“1”,所以输出结果均为“1”。当“$b = 2”语句执行时,将变量b改成指向了内容“2”,原变量a并无影响,只是变量b的指向发生了改变,所以输出结果变量a无变化,变量b为“2”。
下面来看另一种情况,示例代码如下:
<?php
$c = 1;
$d = &$c;
echo '$c ='.$c.'; '.'$d = '.$d."\n".
$d = 2;
echo '$c ='.$c.'; '.'$d = '.$d."\n".
输出结果:
$c = 1; $b = 1;
$c = 2; $b = 2;
$c将值赋给了$d的时候,加上了“&”符号,符号"&"表示引用。使用引用,php引擎不会拷贝一份变量,其实就是将指针指向了$a在内存中的地址,$b中就是保存了这个指针。对它们中的任意一个进行修改都会影响到其他变量,而删除其中的一个变量,其他都会被作用到。
对象引用
在说明对象的引用的时候,先插入一个概念(析构函数):析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行,释放对象所占用的内存。下面来看看示例代码:
情况1:
<?php
class A{
$name = "Jam";
}
$b = new A();
$c = $b;
echo $b->name;
echo $c->name;
$b->name = "Bob";
echo $c->name;
$b = null ;
$c = null ; //此时调用析构函数
?>
输出结果:
Jam Jam Bob
情况2:
<?php
class A{
$name = "Jam";
}
$b = new A();
$c = &$b;
echo $b->name;
echo $c->name;
$b->name = "Bob";
echo $c->name;
$b = null ; //此时调用析构函数
?>
输出结果:
Jam Jam Bob
从情况1可以看出,$b 和 $c都可以调用函数A中的属性,它们当中某一方都可以对属性内容进行更改,在$b和$c都为空的时候,即没有变量在引用对象了,此时会调用析构函数。在情况2中,在变量赋值时加入了&符号,意为复制出一个$c等同与$b,两者为相等的关系。当其中一方为空时,另一方也会为空,此时调用析构函数。