深入理解PHP变量
2021-08-27 14:59:46 小德 PHP 访问次数 141

变量由三部分组成,变量名,变量值,变量类型,变量名与变量值可简单与zval 和zend_value对应。变量内存通过引用计数和写实复制管理,7引用计数转移到具体value结构中不再是zval,变量之间的传递,赋值通常也针对zend_value。

$a;
$b = 1;

以上代码执行时会分配两个zval,$a没有值 相当于unset()了。

一、

    PHP通过zval结构体表示一个变量,不同类型的变量值通过zval嵌入一个联合体表示 也就是zend_value。整型、浮点型的值直接存储在zend_value中,其他类型使用指针,指向具体的类型的结构,zend_value没有bool型,直接通过type区分,因此也不需要value.

二、字符串

    PHP使用zend_string表示字符串,zend_value通过str指向具体的结构,zend_string还储存gc(引用计数信息),h:字符串通过Times33算法得到Hash Code,len 字符串长度,val 字符串内容。

三、数组

    由hashTable实现;key  value之间存在映射函数,不以关键字比较为基本操作,而以内存起始位置+偏移量进行寻址,通过key 映射到内存地址上,O(1)时间复杂度。

    散列表中的成员

        1、arData:散列表中保存存储元素(Bucket)的数组,内存连续,指向数组的起始位置

        2、nTableSize:数组总容量,arData的内存大小根据其确定,2的幂次方。

        3、nNumUsed 数组当前使用的Bucket数,但并不是有效的,因为删除一个元素时并不是马上将其从数组中删除,而是将元素类型标识为is_undef  ,只有容量超限才会删除。nNumOfElements<=nNumUsed时 nNumUsed一直是递增的。

        4、nNextFreeElement:数组自动确立索引时使用,下个没有索引的数组元素进来默认分配的值

        5、pDestructor:删除或覆盖元素时,提供函数的句柄,对旧元素进行清理

        6、u:辅助作用,持久化,是否已经初始化。

     哈希冲突:

        把冲突的bucket通过中间映射表映射串成链表,Bucket链表,查找时需要遍历链表

四、引用

    一种指向其他数据类型的结构,类似C指针,PHP不会讲一个引用指向另一个引用,也就是没有C中的多级指针的概念。