background image

代码如下

:

 
<?php

   

$

var

 = 1;

   

$var_dup = $

var

;

?>
 
第一行,创建了一个整形变量,变量值是

1。 此时保存整形 1 的这个 zval 的 refcount 为 1。

第二行,创建了一个新的整形变量,变量也指向刚才创建的

zval,并将这个 zval 的 refcount

1,此时这个 zval 的 refcount 为 2。

PHP 提供了一个函数可以帮助我们了解这个过程 debug_zval_dump:
代码如下

:

 
<?php

 

$

var

 = 1;

 

debug_zval_dump($

var

);

 

$var_dup = $

var

;

 

debug_zval_dump($

var

);

?>
输出:
long(1) refcount(2)
long(1) refcount(3
 
如果你奇怪

 ,

var

refcount 应该是 1 啊?

我们知道,对于简单变量,

PHP 是以传值的形式穿参数的。也就是说,当执行

debug_zval_dump($

var

)的时候,$

var

会以传值的方式传递给

debug_zval_dump,也就是会导

var

refcount 加 1,所以我们只要能看到,当变量赋值给一个变量以后,能导致 zval 的

refcount 加 1 这个事实即可。
现在我们回头看文章开头的代码,

 当执行了最后一行 unset($

var

)以后,会发生什么呢? 对,

既是

refcount 减 1,上代码:

代码如下

:

 
<?php

   

$

var

 = "laruence";

   

$var_dup = $

var

;

   

unset($

var

);

   

debug_zval_dump($var_dup);

?>
输出:
string(8) "laruence" refcount(2
 
但是,对于下面的代码呢?
代码如下

: