最近在研究PHP底层源码,看了PHP5的zval_struct结构体
struct _zval_struct{
zvalue_value value; //指针指向值
zend_uint refcount__gc; //引用计数
zend_uchar type; //类型
zend_uchar is_ref_gc; //是否是引用
}
union _zvalue_value{
long lval
double dval;
struct {
char *char;
int len;
} str;
HashTable *ht;
zend_object_value obj;
zend_ast *ast;
}zvalue_value;
因为PHP5的引用计数是挂在zval_struct上面的,所以
$a = 123;
那么a的refcount_gc为1,is_ref_gc为0,这个很好理解
但是数组方便的话
$a = ["test"=>1234];
a的refcount_gc为1,is_ref_gc为0;test的refcount_gc为1,is_ref_gc为0
看了底层HashTable的结构体
struct bucket{
ulong h;
uint nKeyLength;
void *pData; //指向值的地址
void *pDataPtr; //指向值的地址,一般为NULL
const char *arkey; ////指向键的地址
...
}
struct HashTable{
...
bucket **arBuckets;
...
}
那么我理解的为如下图
我理解是数组a为结构体_zval_struct
_zval_struct.zvalue_value.ht表示hashtable
_zval_struct.zvalue_value.ht.arBuckets表示桶
buckets的pData和arkey分别为值和键
那么值对应的一个引用计数是哪里来的???
默认pData指向的是_zval_struct?????
如果指向的zval_struct那么为啥要void*啊???
刚看了下PHP5的源码,pData和pDataPtr是不指向_zval_struct的
那么数组里面的值的1个引用计数是哪里来的???