为什么增加 zval 的引用计数不起作用?
Why increasing refcount of zval not working?
我在 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 中发生了什么内部变化以及为什么引用计数保持为 1?
正如 Nikita 在评论中指出的那样,作为常量文字的字符串是 interned - 这是一个内部术语,意思类似于 "singleton for strings" - 因此不计算引用。
与驻留字符串一样,不可变数组(其形状和在内存中的位置在运行时不能更改的数组)也不计算引用计数。
Xdebug 3.0 将使用 this 补丁更新,这将允许它在字符串被驻留或数组不可变时显示。
我在 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 中发生了什么内部变化以及为什么引用计数保持为 1?
正如 Nikita 在评论中指出的那样,作为常量文字的字符串是 interned - 这是一个内部术语,意思类似于 "singleton for strings" - 因此不计算引用。
与驻留字符串一样,不可变数组(其形状和在内存中的位置在运行时不能更改的数组)也不计算引用计数。
Xdebug 3.0 将使用 this 补丁更新,这将允许它在字符串被驻留或数组不可变时显示。