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' );
?>