代码如下
:
<?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
但是,对于下面的代码呢?
代码如下
: