关于PHP中写时复制引用计数的疑问

问题描述

环境:
PHP版本 7.2.1
开发机:腾讯云 1 核 2 GB 1 Mbps

今天在gdb PHP写时复制时候有一点小疑问:

首先贴出问题,下边代码第一个$a(字符串常量)的引用计数为什么是1?

下边是我的gdb的过程:

贴上自己的代码:

  1 <?php
  2 $a = "string";
  3 echo $a;
  4 $b = &$a;
  5 echo $a;

在gdb的时候,期待的结果应该是

clipboard.png
$a的引用计数为0,第二次引用计数为2
但是在自己开发机上进行gdb发现$a的引用计数为1,$b的引用计数为2,$a的结果不符合预期。
gdb结果如下:

clipboard.png

clipboard.png

根据之前的思路,$a = "string" 是属于字面量,是被硬编码在PHP代码中的,是常量字符串。然而我们知道的php字符串分为两类

  1. 常量字符串:在PHP代码中硬编码的字符串,在编译阶段初始化,存储在全局变量表中,refcount一直为0,其在请求结束之后才被销毁(方便重复利用)。
  2. 临时字符串:计算出来的临时字符串,是执行阶段经过zend虚拟机执行opcode计算出来的字符串,存储在临时变量区。

如果按照上边这个来理解的话,refcount=0是肯定的,但是在实际gdb中却得到了1。

如果我们把$a置为临时字符串:

  1 <?php
  2 $a = "string".time();
  3 echo $a;
  4 $b = $a;
  5 echo $a;

其结果如下:

clipboard.png
clipboard.png
符合预期。

我们再通过赋值b字符串常量来打印$b的引用计数:

  1 <?php
  2 $a = "string";
  3 echo $a;
  4 $b = "asdsad";
  5 echo $a;
  6 echo $b;

clipboard.png
通过gdb结果发现在$b被赋值为常量字符串之后,引用计数确实为0.

那么为什么开头$a的引用计数是1呢,感谢各位答疑

阅读 1.5k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题