You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP 7.2与7.3中INTERNED STRING的refcount差异原因咨询

PHP 7.2与7.3中驻留字符串引用计数差异的原因

这个问题其实是PHP版本迭代中对**interned string(驻留字符串)**的引用计数逻辑做了针对性调整导致的,咱们具体拆解:

先搞懂什么是interned string

简单来说,PHP会把一些固定的字符串字面量(比如'123'这种短字符串)放进全局的字符串池里,避免重复创建相同的字符串对象,以此提升性能。这些字符串就是驻留字符串,它们的生命周期和PHP进程绑定,不会被垃圾回收器随意销毁。

PHP 7.2及更早版本的特殊处理

在7.2及之前,PHP对驻留字符串的引用计数做了特殊设定:强制把它们的refcount设为0。
为啥这么做?因为这些字符串属于全局池,是“永久存活”的,根本不需要通过引用计数来管理生命周期。所以哪怕你把$a赋值给$b,xdebug输出的refcount依然是0——PHP认为没必要跟踪这类字符串的引用数。

PHP 7.3的逻辑调整

从7.3开始,PHP团队修改了这个规则,让驻留字符串的引用计数和普通字符串一样正常工作:

  • 当你执行$a = '123'时,这个驻留字符串的refcount会被初始化为1(对应$a的引用);
  • 当你把$a赋值给$b后,refcount会增加到2($a和$b都引用它)。
    不过有个特殊保障:哪怕所有用户变量都不再引用这个字符串,当refcount降到1时,它也不会被销毁——因为全局字符串池还在持有它,直到PHP进程结束才会释放。

这就是为什么你在两个版本里得到的refcount结果完全不同:7.2用的是特殊的0值标记,7.3则是正常跟踪引用关系了。

内容的提问来源于stack exchange,提问作者林益远

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:32:41