服務於建立最簡單的物件
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 協議》,轉載必須註明作者和本文連結