$a = '123';
$b = $a;
此时变量$a和$b,共同指向了同一个内存地址(即存放字符串123的内存地址)。
$b = '456'; 此时当给变量$b从新赋值的时候,才会把变量$b和变量$a分开,把变量$b指向一个新的内存地址。(写时复制技术)
==========================================================================================
$a = '123';
$b = &$a;
此时变量$a和$b,共同指向了同一个内存地址
$b = '456'; 此时$b从新赋值,那么$b所指向的内存中的值由123变成了456,$a和$b指向同一个内存地址,所以变量$a的值也发生了变化。
============================================================================================================
$a = '123';
$b = $a;
$c = &$a;
此时变量$a,$b,$c,共同指向了同一个内存地址
$c = '456'; 此时,给变量$c从新赋值,那么此时会把$c,$a 同 $b 分开,$b还是指向原来的地址,而$a和$c指向了新的地址,同时值修改为了 456
================================================================================================================
$a = '123';
unset($a); 时,会把变量$a从php的变量表中删除掉,并且会释放掉给变量$a所分配的内存空间。
$a = '123';
$b = $a;
unset($a); 时,只会把$a从php的变量表中删除掉,但是$a所指向的内存地址(及存放123的内存地址)并不会被释放掉,因为变量$b,也在指向这个地址,只有当php的任何变量都不指向这个地址时才会把这个地址释放掉
特殊情况:
$a = array(1,2);
$a[] = &$a;
此种情况下,unset($a) ,只是将变量$a在php的变量表中删除,并不会释放掉变量$a所占用的内存,原因是变量$a自身的元素中又指向了变量$a自身所指向的内存地址,此种情况下,php没有办法操作这个变量$a了,这就造成了内存泄漏,php 5.3版本的新的垃圾回收机制就是针对这种情况的,用来回收这种情况下所占用的内存地址。
详细资料:
http://blog.csdn.net/phpkernel/article/details/5732784 变量内部存储
http://blog.csdn.net/phpkernel/article/details/5734743 新的垃圾回收机制
或者查看php手册,手册用也有详细的说明