关于PHP7引用计数的困惑

关于PHP7引用计数的困惑,php,php-internals,Php,Php Internals,我想知道有什么不同?我需要一些解释。非常感谢 ------更新------ 尼基塔·波波夫的——PHP7——内部发生了什么变化?(第41页) 在PHP7中,zval可以被引用计数,也可以不被引用计数。zval结构中有一个标志决定了这一点 有些类型永远不会被重新计数。这些类型是null、bool、int和double 还有其他类型总是被重新计数。这些是对象、资源和引用 还有一些类型,有时会被重新计数。这些是字符串和数组 对于字符串,not refcounted变量称为“插入字符串”。如果您使用的

我想知道有什么不同?我需要一些解释。非常感谢

------更新------

尼基塔·波波夫的——PHP7——内部发生了什么变化?(第41页)


在PHP7中,zval可以被引用计数,也可以不被引用计数。zval结构中有一个标志决定了这一点

有些类型永远不会被重新计数。这些类型是null、bool、int和double

还有其他类型总是被重新计数。这些是对象、资源和引用

还有一些类型,有时会被重新计数。这些是字符串和数组

对于字符串,not refcounted变量称为“插入字符串”。如果您使用的是NTS(非线程安全)PHP7构建(通常是这样),那么代码中的所有字符串文本都将被截取。这些插入字符串经过重复数据消除(即,只有一个具有特定内容的插入字符串),并保证在整个请求期间存在,因此无需对其使用引用计数。如果您使用opcache,这些字符串将存在于共享内存中,在这种情况下,您不能对它们使用引用计数(因为我们的引用计数机制是非原子的)。插入字符串的伪refcount为1,这就是您在这里看到的


对于数组,not refcounted变量称为“不可变数组”。如果使用opcache,那么代码中的常量数组文本将转换为不可变数组。同样,它们存在于共享内存中,因此不能使用refcounting。不可变数组的伪refcount为2,因为它允许我们优化某些分离路径。

在PHP7中,zval可以被引用计数,也可以不被引用计数。zval结构中有一个标志决定了这一点

有些类型永远不会被重新计数。这些类型是null、bool、int和double

还有其他类型总是被重新计数。这些是对象、资源和引用

还有一些类型,有时会被重新计数。这些是字符串和数组

对于字符串,not refcounted变量称为“插入字符串”。如果您使用的是NTS(非线程安全)PHP7构建(通常是这样),那么代码中的所有字符串文本都将被截取。这些插入字符串经过重复数据消除(即,只有一个具有特定内容的插入字符串),并保证在整个请求期间存在,因此无需对其使用引用计数。如果您使用opcache,这些字符串将存在于共享内存中,在这种情况下,您不能对它们使用引用计数(因为我们的引用计数机制是非原子的)。插入字符串的伪refcount为1,这就是您在这里看到的


对于数组,not refcounted变量称为“不可变数组”。如果使用opcache,那么代码中的常量数组文本将转换为不可变数组。同样,它们存在于共享内存中,因此不能使用refcounting。不可变数组的伪refcount为2,因为它允许我们优化某些分离路径。

@devpro这是PHP5.x,两者都没有改变。。conceptual@devpro为什么refcount是0?@devpro它是PHP5.x,两者都没有变化。。conceptual@devpro为什么refcount是0?
<?php

$s = "foobar";

$t = $s;

$u = $s;

echo PHP_VERSION . "\n";

debug_zval_dump($s);

xdebug_debug_zval('s');
string(6) "foobar" refcount(4)
s: (refcount=3, is_ref=0)="foobar"