数组_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; 数组初始化: 数组添加数据: 数组删除数据: 数组获取数据: PHP > 源码 #源码 数组_zend_array http://blog.lujinkai.cn/PHP/源码/数组_zend_array/ 作者 像方便面一样的男子 发布于 2020年12月9日 更新于 2023年12月5日 许可协议 (int32_t)4294967294 上一篇 gc 下一篇