php7 源码解析,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`方法。

技术交流

42e1274b8af00aa6b98a5ce9d1810905.gif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值