为什么增加zval的引用计数不起作用?

时间:2019-07-01 10:17:09

标签: php php-internals

我正在按照以下给定代码转储运行于PHP 7.3.5版(已激活opcache并且PHP已启用线程安全)上的zval容器:

<?php 
$a = "new string";
$b = $a;
xdebug_debug_zval( 'a' );

根据php.net documentation示例#3增加zval的引用计数,它输出 refcount = 2

a: (refcount=2, is_ref=0)='new string'

在我的设置(php7.3.5)上,它输出 refcount = 1

a:
(refcount=1, is_ref=0)string 'new string' (length=10)

使用PHP5.6,我实际上达到了与php.net文档相同的输出。 PHP7内部发生了什么变化以及为什么refcount保持为1?

1 个答案:

答案 0 :(得分:3)

正如Nikita在评论中所指出的那样,字符串是一个常量常量,它是一个内部术语-这是一个内部术语,表示类似于“单个字符串”-因此不计为引用。

与内部字符串一样,不可变数组(即在运行时其形状和位置在内存中可能不会更改的数组)也不会被引用计数。

Xdebug 3.0将使用this补丁进行更新,该补丁将允许它显示何时插入字符串或数组是不可变的。