1.1.1 zval结构
Zend使用zval结构存储PHP变量的值,如下所示:
复制代码代码如下所示:
_zvalue_value { typedef联盟
长语句长值; / * * /
双双双值; / * * /
struct {
字符*;
Int len;
STR };
哈希表*哈希表值; / * * /
zend_object_value obj;
zvalue_value };


结构_zval_struct {
变量信息
zvalue_value值; / * * /
zend_uint引用计数;
zend_uchar型活跃型; / * * /
zend_uchar is_ref;
};

_zval_struct zval结构定义;

Zend决定价值的成员访问基于型值和有效值如下:






is_null

N/A


is_long

对应value.lval


is_double

对应value.dval


is_string

对应value.str


is_array

对应value.ht


is_object

对应value.obj


is_bool

对应value.lval。


is_resource

对应value.lval

根据此表可以在两个地方感兴趣的发现:首先是PHP数组实际上是一个哈希表,这也解释了为什么PHP支持关联数组;其次,资源是一个长期的价值,它包含了通常是一个指针和一个内部数组的索引或其他什么造物主你知道可以认为是一个处理。

1.1.2引用计数
引用计数被广泛用于垃圾收集,存储池,和字符串,和Zend实现了一个典型的引用计数,多个PHP变量可以通过引用计数机制共享相同的变量共享,和剩余的两个成员变量,is_ref和引用计数,用来支持这个共享。
很显然,引用计数用于计数,当参考加值的增加和减少,因此,一旦它被减少到零,Zend将恢复机制。
那么,is_ref

1.1.3 zval状态
在PHP中,有两类变量的引用和非引用,它们存储在Zend引用计数的方式。对于非引用类型的变量,变量需要对方,修改一个变量,不能影响其他变量,使用copy-on-write机制可以解决冲突时写一个Zend的变量,如果发现变量指向变量的多变量共享,是一份原始变量1变量引用计数,并减少引用计数,这个过程叫做zval。然而,对于引用变量,要求不同于非引用类型。分配给作业的变量必须被捆绑。修改一个变量修改所有捆绑变量。
很明显,需要指出的是,机制的当前状态两种情况分别处理。is_ref是目的。指出是否指向变量的引用或未分配的所有变量。变量是在这个时候,修改,和Zend将执行写时复制只有当其机制的is_ref为0,即非参考。

1.1.4 zval状态切换
当所有的赋值操作在zval引用或不引用,一个is_ref足以应付。然而,世界将不会那么好。PHP不能限制用户。当我们引用引用和非引用赋值时,我们必须进行特殊处理。
案例I,看看下面的PHP代码:
复制代码代码如下所示:
< PHP
$ = 1;
美元=美元;
美元=美元;
在非引用赋值中,插入引用
>

该代码首先进行初始化,它会创建一个新的机制,is_ref = 0,引用计数= 1,和一个变量;两非参考分配后,正如我之前所说的,只要B和C指向一个变量;最后一行是一个参考的任务,需要is_ref是1,但Zend发现C点zval不是引用类型,然后创建一个单独的变量C,和D将指向变量。
在本质上,这也可以被看作是一种写时拷贝,不只是价值,但is_ref也是一个受保护的对象。
整个过程说明如下:




案例二,看看下面的PHP代码:
复制代码代码如下所示:
< PHP
$ = 1;
美元=美元;
美元=美元;
在一个引用赋值中,插入一个非引用
>

的第一个三字代码将A,B和C的一个机制,is_ref = 1,引用计数= 3;第四是非引用赋值,通常只需要增加引用计数。然而zval属于参考变量的目标,增加引用计数显然是错误的,解决的办法是Zend单独产生复制机制D.
整个过程如下:




1.1.5参数传递
PHP函数的传递和变量的赋值是相同的。非引用转换等同于非引用赋值。参考转让相当于引用赋值,也可能导致机制状态切换的执行。这将在后面讲到。