问题描述
环境:
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的时候,期待的结果应该是
$a的引用计数为0,第二次引用计数为2
但是在自己开发机上进行gdb发现$a的引用计数为1,$b的引用计数为2,$a的结果不符合预期。
gdb结果如下:
根据之前的思路,$a = "string" 是属于字面量,是被硬编码在PHP代码中的,是常量字符串。然而我们知道的php字符串分为两类
- 常量字符串:在PHP代码中硬编码的字符串,在编译阶段初始化,存储在全局变量表中,refcount一直为0,其在请求结束之后才被销毁(方便重复利用)。
- 临时字符串:计算出来的临时字符串,是执行阶段经过zend虚拟机执行opcode计算出来的字符串,存储在临时变量区。
如果按照上边这个来理解的话,refcount=0是肯定的,但是在实际gdb中却得到了1。
如果我们把$a置为临时字符串:
1 <?php
2 $a = "string".time();
3 echo $a;
4 $b = $a;
5 echo $a;
其结果如下:
符合预期。
我们再通过赋值b字符串常量来打印$b的引用计数:
1 <?php
2 $a = "string";
3 echo $a;
4 $b = "asdsad";
5 echo $a;
6 echo $b;
通过gdb结果发现在$b被赋值为常量字符串之后,引用计数确实为0.
那么为什么开头$a的引用计数是1呢,感谢各位答疑