PHP7.1中数组初始refcount为2的原因探究
为什么PHP数组$a的引用计数(refcount)初始为2?
先看你的代码和对应的输出:
代码示例
$a = [1, 2, 3]; xdebug_debug_zval('a'); $b = $a; xdebug_debug_zval('a'); unset($b); xdebug_debug_zval('a');
输出结果
a: (refcount=2, is_ref=0)=array (2 => (refcount=0, is_ref=0)=1, 1 =>(refcount=0, is_ref=0)=2) a: (refcount=3, is_ref=0)=array (2 => (refcount=0, is_ref=0)=1, 1 => (refcount=0, is_ref=0)=2) a: (refcount=2, is_ref=0)=array (2 => (refcount=0, is_ref=0)=1, 1 => (refcount=0, is_ref=0)=2)
这个问题的核心是Xdebug的xdebug_debug_zval函数的实现细节,结合PHP内部引用计数的工作逻辑来解释:
- 当你执行
$a = [1, 2, 3];时,PHP确实只创建了一个数组对象,此时这个数组的真实引用计数是1——只有变量$a持有它的引用。 - 但
xdebug_debug_zval在读取并输出zval信息的过程中,会临时给这个zval增加一次引用计数(防止读取过程中数组被意外销毁)。所以你看到的refcount=2,其实是真实引用计数(1)加上Xdebug临时占用的那1个引用。
再对应输出验证这个逻辑:
- 执行
$b = $a;后,$b成为数组的第二个真实引用,真实refcount变为2,加上Xdebug的临时引用,就显示为3,和输出一致。 - 执行
unset($b);后,$b的引用被移除,真实refcount回到1,加上Xdebug的临时引用,显示为2,也和输出匹配。
简单来说,Xdebug的这个调试函数在工作时会“占用”一个引用计数,所以你看到的数值会比实际的真实引用计数多1。
内容的提问来源于stack exchange,提问作者GerBawn
相关产品推荐
相关产品推荐

