我正在按照以下给定代码转储在PHP 7.3.5版上运行的zval容器(已激活opcache并且PHP已启用线程安全):
<?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?
最佳答案
正如Nikita在评论中所指出的那样,字符串是一个常量常量,它是一个内部术语-这是一个内部术语,表示类似于“单个字符串”-因此不计入引用。
除内部字符串外,不可变数组(即在运行时其形状和位置在内存中可能不会更改的数组)也不会被引用计数。
Xdebug 3.0将使用this补丁进行更新,该补丁将允许它显示何时插入字符串或数组是不可变的。