400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

变量改变时PHP内核做了哪些工作

本篇内容主要讲解“变量改变时PHP内核做了哪些工作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“变量改变时PHP内核做了哪些工作”吧!

创新互联建站从2013年成立,是专业互联网技术服务公司,拥有项目网站设计、做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元临淄做网站,已为上家服务,为临淄各地企业和个人服务,联系电话:13518219792

看下面的内容之前先对zval这个结构体做个了解

typedef struct _zval_struct {     zvalue_value value;     zend_uint refcount;     zend_uchar type;     zend_uchar is_ref; } zval;

zval结构体中共有4个元素,value是一个联合体,用来真正的存储zval的值,refcount用来计数该zval被多少个变量使用,type表示zval所存储的数据类型,is_ref用来标志该zval是否被引用。

引用计数

我们一起来剖析下上面这段代码:

写时复制

上面这段代码执行完之后,一般肯定希望$a=1,$b=6,但是如果像引用计数那样,$a$b指向相同的zval,修改$b之后$a不是也变了?
这个具体是怎么实现的呢,我们一起来看下:

写时改变

上面这段代码执行完之后一般希望是:$a == $b == 1。这个又是怎么实现的呢?

分离的问题

说道现在聪明的你可能已经看出点问题了,如果一个zval结构体既有refcount计数又有is_ref引用这个时候怎么办?

如果出现上面这种情况的时候,如果$a、$b、$c指向同一个zval结构体,进行改变的时候Zend到底去听谁的?其实这个地方不会指向同一个zval了。
如果对一个is_ref = 0 && refcount >1的zval进行写时改变这种赋值形式(就是引用赋值)的时候,Zend会将等号右边的变量分离出来一个新的zval,
对这个zval进行初始化,对之前的zval的refcount进行减1操作,让等号左边的变量指向这个新的zval,refcount进行加1操作,is_ref=1。看看下面这张图片

变量改变时PHP内核做了哪些工作

上面这又是另外一种情况,在is_ref = 1的情况下,试图单纯的进行refcount+1操作的时候会分离出来一个新的zval给等号左边的变量,并初始化他,看看下面这张图片

变量改变时PHP内核做了哪些工作

到此,相信大家对“变量改变时PHP内核做了哪些工作”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


标题名称:变量改变时PHP内核做了哪些工作
分享网址:http://mbwzsj.com/article/pdsgii.html

其他资讯

让你的专属顾问为你服务