您好,登錄后才能下訂單哦!
本篇文章為大家展示了opcode操作數的類型介紹,代碼簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
zend_op_array.opcodes 指向指令列表,具體每條指令的結構如下:
struct _zend_op { // *opline *opcodes const void *handler; //指令執行handler znode_op op1; //操作數1 znode_op op2; //操作數類型實際就是個32位整形,它主要用于存儲一些變量的索引位置、數值記錄等等 znode_op result; //返回值 uint32_t extended_value; uint32_t lineno; zend_uchar opcode; //opcode指令 zend_uchar op1_type; //操作數1類型 zend_uchar op2_type; zend_uchar result_type; //返回值類型 }; //操作數結構 //比如賦值語句:"$a = 45;",兩個操作數分別記錄"$a"、"45"的存儲位置,執行時根據op2取到值"45", //然后賦值給"$a",而"$a"的位置通過op1獲取到 //當然操作數并不是全部這么用的,上面只是賦值時候的情況,其它操作會有不同的用法 //如函數調用時的傳參,op1記錄的就是傳遞的參數是第幾個,op2記錄的是參數的存儲位置, //result記錄的是函數接收參數的存儲位置。 typedef union _znode_op { //操作數類型實際就是個32位整形,它主要用于存儲一些變量的索引位置、數值記錄等等 uint32_t constant; //操作數記錄著當前指令的關鍵信息, 可以用于變量的存儲、訪問 uint32_t var; uint32_t num; uint32_t opline_num; /* Needs to be signed */ #if ZEND_USE_ABS_JMP_ADDR zend_op *jmp_addr; #else uint32_t jmp_offset; #endif #if ZEND_USE_ABS_CONST_ADDR zval *zv; #endif } znode_op;
//操作數有5種不同的類型; #define IS_CONST (1<<0) //字面量,編譯時就可確定且不會改變的值,比如:$a = "hello~",其中字符串"hello~"就是常量 #define IS_TMP_VAR (1<<1) //臨時變量 $a = "hello~" . time(),其中"hello~" . time()的值類型就是IS_TMP_VAR //"123" + $b的結果類型也是IS_TMP_VAR,從這兩個例子可以猜測,臨時變量多是執行期間其它 //類型組合現生成的一個中間值,由于它是現生成的,所以把IS_TMP_VAR賦值給IS_CV變量時不會增加其引用計數 #define IS_VAR (1<<2)//PHP變量 //這個很容易認為是PHP腳本里的變量,其實不是,這里PHP變量的含義可以這樣理解:PHP變量是沒有顯 //式的在PHP腳本中定義的,不是直接在代碼通過$var_name定義的 //。這個類型最常見的例子是PHP函數的返回值,再如$a[0]數組這種,它取出的值也是IS_VAR,再比如$$a這種 #define IS_UNUSED (1<<3) /* Unused variable */ //表示操作數沒有用 #define IS_CV (1<<4) /* Compiled variable */ //PHP腳本變量,即腳本里通過$var_name定義的變量,這些變量是編譯階段確定的,所以是compile variable //result_type除了上面幾種類型外還有一種類型EXT_TYPE_UNUSED (1<<5),返回值沒有使用時會用到, //這個跟IS_UNUSED的區別是:IS_UNUSED表示本操作返回值沒有意義(也可簡單的認為沒有返回值), //而EXT_TYPE_UNUSED的含義是有返回值,但是沒有用到,比如函數返回值沒有接收
上述內容就是opcode操作數的類型介紹,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。