php 变量赋值、引用以及垃圾回收

变量赋值:

$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手册,手册用也有详细的说明





你可能感兴趣的:(php相关)