background image

PHP 基础:PHP 垃圾回收机制引用计数器概念

php 变量存在一个叫"zval"的变量容器中,"zval"变量容器包括含变量的类型和值,还包括

额外的两个字节信息,分别是 is_ref”

表示变量是否属于引用, refcount”指向这个 zval 变

量容器的变量个数
如果你安装了 xdebug,就可以用 xdebug_debug_zval()

显示 zval”的信息了。如下:

代码如下:
 
<?php

$str

 = "jb51.net";

xdebug_debug_zval('str');
结果:
str:
(refcount=1, is_ref=0),
string 'jb51.net' (length=10)

只有当变量容器在 refcount“变成 0 时就被销毁.当你 unset()

一个变量时,想要的 zval”中

refcount 就会减 1,再来说说前几天遇到的 unset 引用问题:
代码如下:
 
<?php

$a

 = "aaa";

$b

 = & 

$a

;

unset(

$a

);

//echo $b; //这里依然会输出 aaa,用 xdebug_debug_zval 打印你就知道为什么了

xdebug_debug_zval("b");
结果:
b:
(refcount=1, is_ref=0),string 'aaa' (length=3)
继续说引用计数器问题,对于

array

和 object 符合类型情况又不一样了:

代码如下:
 
<?php

$arr

 = 

array

( 'a' => 'aaa', 'b' => "bbb" );

xdebug_debug_zval( 'arr' );

$arr

['aaa'] = 

$arr

['a'];

xdebug_debug_zval( 'arr' );
?>