op_array 结构
服务于创建最简单的对象
op_array结构体字段:
struct _zend_op_array { //编译阶段的最终产物,也是执行阶段的输入
//ast解析过程确定了当前脚本定义了那些变量,并为这些变量顺序编号
//每个function也会编译为独立的zend_op_array
//zend_op_array包含着当前作用域下的所有堆栈信息,函数调用实际就是不同zend_op_array间的切换
/* Common elements */
//common是普通函数或类成员方法对应的opcodes快速访问时使用的字段
zend_uchar type;
zend_uchar arg_flags[3]; /* bitset of arg_info.pass_by_reference */
uint32_t fn_flags;
zend_string *function_name;
zend_class_entry *scope; //范围
zend_function *prototype; //原型
uint32_t num_args;
uint32_t required_num_args; //参数个数
zend_arg_info *arg_info; // 参数信息
/* END of common elements */
uint32_t *refcount;
uint32_t last;
//opcode指令数组
zend_op *opcodes; //指向指令列表,具体每条指令的结构
//编译前此值为0,然后发现一个新变量这个值就加1
int last_var;
//临时变量数:op_type为IS_TMP_VAR、IS_VAR的变量
uint32_t T;
//PHP变量名数组
zend_string **vars;//这个数组在ast编译期间配合last_var用来确定各个变量的编号,非常重要的一步操作
int last_live_range;
int last_try_catch;
zend_live_range *live_range;
zend_try_catch_element *try_catch_array;
/* static variables support */
//静态变量符号表:通过static声明的
HashTable *static_variables;
zend_string *filename;
uint32_t line_start;
uint32_t line_end;
zend_string *doc_comment;
//延迟声明的链表
uint32_t early_binding; /* the linked list of delayed declarations */
//字面量数量
int last_literal; //字面量(常量)数组,这些都是在PHP代码定义的一些值
zval *literals; // 保存变量的初始化值、调用的函数/类/常量名称等值,这些字面量也有一个唯一的编号
//所以执行的过程实际就是根据各指令调用不同的C函数,
//然后根据变量、字面量、临时变量的编号对这些值进行处理加工。
int cache_size;//运行时缓存数组大小
void **run_time_cache; //运行时缓存,主要用于缓存一些znode_op以便于快速获取数据
void *reserved[ZEND_MAX_RESERVED_RESOURCES];
};
本作品采用《CC 协议》,转载必须注明作者和本文链接