background image

PHP

 

     垃圾回收机制引用计数器概念

 

 

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

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

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

zval 变量容器的变量个数。

如果你安装了

xdebug

,就可以用 xdebug_debug_zval()

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

1.

<?

php

2.

$str 

=

 

"phpddt.com"

;

3.

xdebug_debug_zval

(

'str'

);

结果:

str:

(refcount=1, is_ref=0),

string 

'phpddt.com'

 (length=10)

只有当变量容器在 refcount“变成 0 时就被销毁.当你 unset()一个变量时,想要的
“zval”中 refcount 就会减 1,再来说说前几天遇到的

unset

 

     引用问题

 

 

1.

<?

php

2.

$a 

=

 

"aaa"

;

3.

$b 

=

 

&

 $a

;

4.

unset

(

$a

);

5.

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

么了

6.

xdebug_debug_zval

(

"b"

);

结果:

b:

(refcount=1, is_ref=0),string 'aaa' (length=3)

继续说引用计数器问题,对于 array 和 object 符合类型情况又不一样了:

1.

<?

php

2.

/** by www.phpddt.com */

3.

$arr 

=

 array

(

 

'a'

 

=>

 

'aaa'

,

 

'b'

 

=>

 

"bbb"

 

);

4.

xdebug_debug_zval

(

 

'arr'

 

);