PHP内核API

本文介绍了PHP内部实现中的关键宏(如EG(), CG(), PG(), FG())及其用途,并详细阐述了重要数据类型(如zval, HashTable)及HashTable的操作(如创建、添加、查找等)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重要的宏:

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);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值