深入剖析PHP的引用计数机制

变量声明和赋值PHP后,变量名是在符号表中,而价值和类信息存在在zval。机制包含四个变量,is_ref、引用计数、价值、类型、机制的源代码如下。
复制代码代码如下所示:
结构_zval_struct {
变量信息
zvalue_value值; / * * /
zend_uint refcount__gc;
zend_uchar型活跃型; / * * /
zend_uchar is_ref__gc;
};

引用计数显示价值多少地址具有相同的机制,当引用计数为0,机制被破坏
is_ref指示变量是引用,有0和1的状态。

这是一个分析变量时将复制或开辟新的内存空间
1、当is_ref = 0和引用计数>1,如果我们改变一个变量指向的变量的值,我们将生成新的变量。引用计数——原变量,例如:a = 1;$ = $ $ b = 2;变量;将被复制,即原AB分到同一个。稍后,它将使用新的打开的。

2。当is_ref = 0和引用计数>1,如果变量被赋值给一个变量,然后用来给变量赋值分配将使用相同的机制,而其他点的原始变量的变量将指向一个新的复制机制,并引用计数将被重新计算,例如:美元= 1美元;B = C =美元美元美元美元;a;广告;然后,使用原zval,公元前使用新的复制机制

3、当is_ref = 1和引用计数>1,如果变量被复制到一个非参考变量,非参考变量将由一个新的机制和变量引用计数拷贝是不变的,如美元= 1,B =美元美元美元美元,C = AB,然后使用原始变量,和新的副本由AB的应用
类型是值类型的变量,它的定义如下
复制代码代码如下所示:
#定义is_null 0
#定义is_long 1
#定义is_double 2
#定义is_bool 3
#定义is_array 4
#定义is_object 5
#定义is_string 6
#定义is_resource 7
#定义is_constant 8
#定义is_constant_array 9

值表示变量的值,而他又是一个社区,与代码如下
复制代码代码如下所示:
_zvalue_value { typedef联盟
长语句长值; / * * /
双双双值; / * * /
struct {
字符*;
Int len;
STR };
哈希表*哈希表值; / * * /
zend_object_value obj;
zvalue_value };

现在您知道PHP是如何被转换的,因为它的值实际上是任何类型的代表性结构,并且特定值是根据社区中存储的变量的类型来确定的。

请参见下面的示例1
复制代码代码如下所示:
-----------。
$ = 1;
美元=美元;
美元=美元;
-----------。
美元=美元;
-----------。
$ = 2;
-----------。
$ = null;

看变化,引用计数,is_ref,和变量
在第一部分之后,看看输出。
1 -----------------------------
答:(引用计数为3,is_ref = 0),智力1
B:(引用计数为3,is_ref = 0),智力1
C:(引用计数为3,is_ref = 0),智力1
可以看出,A,B,和C中使用相同的变量
然后看看执行的第二部分。
2 ----------------------------
答:(引用计数为2,is_ref = 1),智力1
B:(引用计数为2,is_ref = 0),智力1
C:(引用计数为2,is_ref = 0),智力1
D:(引用计数为2,is_ref = 1),智力1
请注意,在这个时候,我是在一起的,它们使用相同的机制,和BC使用新生成的机制和重新引用计数和两zval is_ref。
3 ----------------------------
答:(引用计数为2,is_ref = 1),智力2
B:(引用计数为2,is_ref = 0),智力1
C:(引用计数为2,is_ref = 0),智力1
D:(引用计数为2,is_ref = 1),智力2
可以知道这两is_ref = 1 AD的好基友的价值,同时改变了
4 ----------------------------
答:(引用计数为2,is_ref = 1),智力2
B:(引用计数为1,is_ref = 0),空
C:(引用计数为1,is_ref = 0),智力1
D:(引用计数为2,is_ref = 1),智力2
公元前is_ref = 0因为他们的机制,所以他们不是好基友,他们的价值观不同时变化,所以BC分裂机制再次,B = null C = 1