2016-01-13 87 views
6
<?php 

$s = "foobar"; 

$t = $s; 

$u = $s; 

echo PHP_VERSION . "\n"; 

debug_zval_dump($s); 

xdebug_debug_zval('s'); 

运行5.6.16混淆PHP 7引用次数

php 5 refcount

运行7.0.2

php 7 refcount

我想结果(PHP 7)应是:

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

我想知道是什么造成了差异?需要一些解释。非常感谢。

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

Nikita Popov's - PHP 7 - 内部有什么变化? (P41)

http://www.slideshare.net/nikita_ppv/php-7-what-changed-internally

slideshare

+0

http://php.net/manual/en/features.gc.refcounting-basics.php – devpro

+0

@devpro这是php 5.x – Lynn

+0

两个都没有改变..概念 – devpro

回答

8

在PHP 7的zval可以参考计数或没有。 zval结构中有一个标志确定了这一点。

有一些类型,从来没有被引用。这些类型为null,bool,int和double。

还有其他类型,总是refcounted。这些是对象,资源和参考。

然后有类型,它们是有时 refcounted。那些是字符串和数组。

对于字符串,未引用的变体称为“interned字符串”。如果您使用的是NTS(不是线程安全的)PHP 7版本,您通常会使用代码中的所有字符串文字。这些被插入的字符串被重复数据删除(即只有一个带有特定内容的被插入的字符串)并且保证在请求的整个持续时间内存在,所以不需要为它们使用引用计数。如果使用opcache,这些字符串将存在于共享内存中,在这种情况下,您不能使用对它们使用引用计数(因为我们的refcounting机制是非原子的)。 Interned字符串的虚拟引用数为1,这是你在这里看到的。

对于数组而言,未引用的变体称为“不可变数组”。如果使用opcache,那么代码中的常量数组文字将被转换为不可变数组。再次,这些生活在共享内存,因此不得使用refcounting。不可变数组的虚拟引用数为2,因为它允许我们优化某些分离路径。

+0

谢谢!得到它了! :) – Lynn