重要的宏:
EG():是excutor_global的简写,这个宏可以用来访问符号表,函数,资源信息和常量
CG():是 compile_global的简写,用来访问核心全局变量。
PG():PHP全局变量。我们知道php.ini会映射一个或者多个PHP全局结构。举几个使用这个宏的例子:PG(register_globals),PG(safe_mode), PG(memory_limit)
FG():文件全局变量。大多数文件I/O或相关的全局变量的数据流都塞进标准扩展出口结构。
重要的数据类型:
Zend/zend.h中:
zvalue_value
zval
Zend/zend_hash.h中:
Bucket
HashTable
main/
Zend/
zend.c:
宏:CG(function_table)
Zeng/zeng_types.h :定义内核使用的基本数据类型
_zval_struct的别名zval就定义在这里
Zend/zend_hash.h: HashTable的API
创建并初始化一个HashTable:
int zend_hash_init(
HashTable *ht,
uint nSize,
hash_func_t pHashFunction,
dtor_func_t pDestructor,
zend_bool persistent
);
为hashtable申请内存:ALLOC_HASHTABLE(ht)
添加&&修改
int zend_hash_add(
HashTable *ht, //待操作的ht
char *arKey, //索引,如"my_key"
uint nKeyLen, //字符串索引的长度,如6
void **pData, //要插入的数据,注意它是void **类型的。int *p,i=1;p=&i,pData=&p;。
uint nDataSize,
void *pDest //如果操作成功,则pDest=*pData;
);
int zend_hash_update(
HashTable *ht,
char *arKey,
uint nKeyLen,
void *pData,
uint nDataSize,
void **pDest
);
int zend_hash_index_update(
HashTable *ht,
ulong h,
void *pData,
uint nDataSize,
void **pDest
);
int zend_hash_next_index_insert(
HashTable *ht,
void *pData,
uint nDataSize,
void **pDest
);
查找:
int zend_hash_find(HashTable *ht, char *arKey, uint nKeyLength,void **pData);
int zend_hash_index_find(HashTable *ht, ulong h, void **pData);
检测某个key是否存在:
int zend_hash_exists(HashTable *ht, char *arKey, uint nKeyLen);
int zend_hash_index_exists(HashTable *ht, ulong h);
Zend/zend_hash.h:
EG(function_table) = CG(function_table);
EG(class_table) = CG(class_table);