数组_zend_array

本文最后更新于:2023年12月5日 晚上

zend_array 和 HashTable 都是 _zend_array 结构体的别名。

185 struct _zend_array {
186     zend_refcounted_h gc;	// 垃圾回收相关
187     union {
188         struct {
189             ZEND_ENDIAN_LOHI_4(
190                 zend_uchar    flags,
191                 zend_uchar    nApplyCount,
192                 zend_uchar    nIteratorsCount,
193                 zend_uchar    consistency)
194         } v;
195         uint32_t flags;
196     } u;	// 主要是flags
197     uint32_t          nTableMask;	// 它本身的值就是几个桶, 和h进行或运算可以计算最终落在哪个桶里
198     Bucket           *arData;	// 指向一个数组, 数组中的每一个元素都是一个bucket, buket是一个结构体, 其中存储key-value对,*arData表示这个数组的内存首地址
199     uint32_t          nNumUsed;	// bucket中有多少个被使用了
200     uint32_t          nNumOfElements;	// 真正有意义的值
201     uint32_t          nTableSize;	// bucket的大小, 初始值是8
202     uint32_t          nInternalPointer;	// 内部指针
203     zend_long         nNextFreeElement;	// 不指定key赋值value的时候, key就从这里获取, 初始化为0
204     dtor_func_t       pDestructor;	// 函数指针, 用来析构用的
205 };
typedef struct _Bucket {
    zval              val; 	// key-value的value
    zend_ulong        h;                /* hash value (or numeric index)   */	// 通过hash算法算出来的hash值
    zend_string      *key;              /* string key or NULL for numerics */	// key-value的key
} Bucket;

数组初始化:

数组添加数据:

数组删除数据:

数组获取数据:



数组_zend_array
http://blog.lujinkai.cn/PHP/源码/数组_zend_array/
作者
像方便面一样的男子
发布于
2020年12月9日
更新于
2023年12月5日
许可协议