深入解析PHP的引用计数机制_php技巧_脚本之家

PHP的变量表明并赋值后,变量名存在符号表中,而值和类音讯存在zval中,zval中带有五个变量,is_ref,refcount,value,type,zval源码如下复制代码 代码如下:struct _zval_struct { /*
Variable information */ zvalue_value value; /* value */ zend_uint
refcount__gc; zend_uchar type; /* active type */ zend_uchar
is_ref__gc;
};refcount代表value地址与其同样的zval共有多少个,refcount=0时,zval被销毁is_ref表示三个zval是还是不是被引述,有“0”和“1”三种状态

这里解析一下怎么样时候zval会被复制或许开辟新的内部存款和储蓄器空间呢1.当is_ref=0,且refcount>1时,假诺退换某些指向该zval的变量的值,会生成新zval,原zval的refcount–,比如:$a=1;$b=$a;$b=2;,zval将被复制,也正是说原先ab指向同贰个zval,后来b会使用新开采的zval2.当is_ref=0,且refcount>1时,如若将zval赋值给某些援用变量,那么用来赋值和变量和被赋值的变量会动用同一个原zval,而任何指向原zval的变量将会指向二个新复制的zval,且refcount会被再次总计,举个例子:$a=1;$b=$a;$c=$a;$d=&$a;,那时候ad使用原zval,bc使用新复制出来的zval3.当is_ref=1,且refcount>1时,要是将zval复制给有些非援引变量,该非征引变量会选取叁个新复制的zval,元zval的refcount不改变,举例:$a=1;$b=&$a;$c=$a,那么ab使用原zval,而c使用新复制的zvaltype表示该zval的值类型,宏定义如下复制代码 代码如下:#define IS_NULL 0 #define
IS_LONG 1 #define IS_DOUBLE 2 #define IS_BOOL 3 #define IS_ARRAY
4 #define IS_OBJECT 5 #define IS_STRING 6 #define IS_RESOURCE 7
#define IS_CONSTANT 8 #define IS_CONSTANT_A本田CR-VRAY
9value代表该zval的值,他也是个全体,代码如下复制代码 代码如下:typedef union _zvalue_value
{ long lval; /* long value */ double dval; /* double value */ struct
{ char *val; int len; } str; HashTable *ht; /* hash table value */
zend_object_value obj; }
zvalue_value;今后你知道php是怎么类型转变的了,因为他的值存的实际是个能够代表任何项目标构造体,而实际的取值则基于type来决定是用全部里的哪位变量来存值的见上边包车型客车例子1复制代码 代码如下:.———–$a = 1;$b = $a;$c
= $a;.———–$d = &$a;.———–$a = 2;.———–$b =
null;查看refcount,is_ref,zval的变通履行完第意气风发部分新生拜访输出1—————————–a:,int
1b:,int 1c:,int
1能够看看来a,b,c使用同一个zval再看施行完第3局部的2—————————-a:,int
1b:,int 1c:,int 1d:,int
1注意那时a,d在一同了,他们使用同一个zval,而bc使用一个新变化的zval,同期再次总括四个zval的refcount和is_ref3—————————-a:,int
2b:,int 1c:,int 1d:,int
2可以看到ad那多少个is_ref=1的好很好的朋友的值是同期改造的4—————————-a:,int
2b:,nullc:,int 1d:,int
2bc是因为她们的zval的is_ref=0,所以她们不是好老铁,他们的值不会同时改造,于是bc的zval再一次崩溃,b
= null c = 1

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图