加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

关于PHP 7 refcount的困惑

发布时间:2020-12-13 13:34:19 所属栏目:PHP教程 来源:网络整理
导读:?php$s = "foobar";$t = $s;$u = $s;echo PHP_VERSION . "n";debug_zval_dump($s);xdebug_debug_zval('s'); 在PHP 5.6.16中运行 在PHP 7.0.2中运行 我认为结果(PHP 7)应该是: string(6) "foobar" refcount(4)s: (refcount=3,is_ref=0)="foobar" 我想知道是
<?php

$s = "foobar";

$t = $s;

$u = $s;

echo PHP_VERSION . "n";

debug_zval_dump($s);

xdebug_debug_zval('s');

在PHP 5.6.16中运行

在PHP 7.0.2中运行

我认为结果(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

在PHP 7中,zval可以被引用计数或不计算. zval结构中有一个标志确定了这一点.

有些类型从未被重新计算过.这些类型为null,bool,int和double.

还有其他类型总是被重新计算.这些是对象,资源和引用.

然后有类型,有时会被重新计算.那些是字符串和数组.

对于字符串,not-refcounted变体称为“interned string”.如果您正在使用NTS(非线程安全的)PHP 7构建(通常是这样),则代码中的所有字符串文字都将被实现.这些实习字符串经过重复数据删除(即只有一个具有特定内容的实习字符串)并且保证在请求的整个持续时间内存在,因此不需要对它们使用引用计数.如果使用opcache,这些字符串将存在于共享内存中,在这种情况下,您不能对它们使用引用计数(因为我们的引用计数机制是非原子的). Interned字符串的伪引用计数为1,这就是您在此处看到的内容.

对于数组,未引用的变量称为“不可变数组”.如果使用opcache,则代码中的常量数组文字将转换为不可变数组.再一次,这些生活在共享内存中,因此不得使用引用计数.不可变数组的伪引用数为2,因为它允许我们优化某些分离路径.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读