今日(2025-04-30 13:34:54)推荐: PHP7源码阅读笔记(不断更新) zend_API.h Zend引擎提供的常用API函数 RETURN_STR(s) 作用:返回一个zend_string字符串。参考:参考示例 RETURN_STRING(s) 作用:返回一个char *字符串。参考:参考示例 ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args) 作用:在使用FAST ZPP方式解析PHP方法传入的参数时,会用到这个宏方法。这个宏方法用于指定参数的最小个数和最大个数。参考:参考示例 ZEND_API int zend_parse_parameters(int num_args, const char *type_spec, ...); 作用:解析PHP方法函数传入的参数。把传入的参数转换为PHP内核相应的类型。参考:参考示例 int zend_set_local_var(zend_string *name, zval *value, int force); 设置本地变量,变量名为zend_string. 参考示例 int zend_set_local_var_str(const char *name, size_t len, zval *value, int force); 设置本地变量,变量名为字符串指针。参考示例 array_init(arg) 初始化数组。宏方法。参考示例 object_init_ex(arg, ce) 使用指定的class_entry初始化对象。宏方法。参考示例 zend_execute_API.h 类的操作,方法的执行等相关API方法 zend_class_entry *zend_fetch_class(zend_string *class_name, int fetch_type) 获取类。参考示例 zend_string.h 字符串zend_string结构相关操作 ZSTR_LEN(zstr) 作用:用于获取zend_string字符串的长度。参考示例 ZSTR_VAL(zstr) 作用:用于获取zend_string字符串的值。参考示例 zend_string *zend_string_init(const char *str, size_t len, int persistent) 初始化zend_string字符串。参考示例 void zend_string_release(zend_string *s) 释放zend_string,如果引用数为0,则释放内存。参考示例 zend_typs.h 对于zval结构体的操作方法 zval操作相关宏方法命名规律: ZVAL_ 开头的方法,是用于设置值的相关方法。 ZVAL_NULL(zval *) 设置值为null。宏方法。参考示例 ZVAL_LONG(zval *, long) 设置值为整型。宏方法。参考示例 ZVAL_STR(zval *, zend_string *) 设置值为字符串。宏方法。参考示例 Zend/zend_hash.h 哈希处理方法 zend_hash_num_elements 获取哈希/数组的元素个数。参考示例 array_init(arg) 初始化一个数组。参考示例 array_init_size(arg, size) 初始化一个数组,指定初始化数组的元素个数。参考示例 ZEND_HASH_FOREACH_KEY_VAL 和 ZEND_HASH_FOREACH_END 配合使用,实现foreach的效果。参考示例 zend_bool ZEND_FASTCALL zend_hash_exists(const HashTable *ht, zend_string *key) 检测指定的key在哈希中是否存在。key为字符串。参考示例 zend_bool ZEND_FASTCALL zend_hash_index_exists(const HashTable *ht, zend_ulong h) 检测指定的key在哈希中是否存在。key为数字。参考示例 zval* ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *key) 根据key查找指定的值。key为字符串。参考示例 zval* ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulong h) 根据key查找指定的值。key为数字。参考示例 zend_hash_update(ht, key, pData) 更新指定key的值。key为字符串。参考示例 zend_hash_index_update(ht, h, pData) 更新指定key的值。key为数字。参考示例 main/spprintf.h 字符处理 zend_string *strpprintf(size_t max_len, const char *format, ...) 根据传入的format和参数,生成一个zend_string。可以实现把多个参数拼接成一个字符串。参考示例 其他资料 PHP7 Opcode生成过程 大家都知道PHP代码会转换为Opcode PHP7执行一个脚本的过程大概分为几步。 1. Lexing:词法扫描分析,将源文件转换成 token 流; 2. Parsing:语法分析,从 token 流生成抽象语法树; 3. Compilation:从抽象语法树生成 op arrays。 整个分析过程的相关代码,大家可以看`Zend/zend_language_scanner.c`文件中的`compile_file`方法。