<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### 3.3.1 數據結構 執行流程中有幾個重要的數據結構,先看下這幾個結構。 #### 3.3.1.1 opcode opcode是將PHP代碼編譯產生的Zend虛擬機可識別的指令,php7共有173個opcode,定義在`zend_vm_opcodes.h`中,PHP中的所有語法實現都是由這些opcode組成的。 ```c struct _zend_op { const void *handler; //對應執行的C語言function,即每條opcode都有一個C function處理 znode_op op1; //操作數1 znode_op op2; //操作數2 znode_op result; //返回值 uint32_t extended_value; uint32_t lineno; zend_uchar opcode; //opcode指令 zend_uchar op1_type; //操作數1類型 zend_uchar op2_type; //操作數2類型 zend_uchar result_type; //返回值類型 }; ``` #### 3.3.1.2 zend_op_array `zend_op_array`是Zend引擎執行階段的輸入,整個執行階段的操作都是圍繞著這個結構,關于其具體結構前面我們已經講過了。 ![](https://box.kancloud.cn/985c86ac9e827c2a05ed38d12c369fd0_436x245.png) 這里再重復說下zend_op_array幾個核心組成部分: * __opcode指令__:即PHP代碼具體對應的處理動作,與二進制程序中的代碼段對應 * __字面量存儲__:PHP代碼中定義的一些變量初始值、調用的函數名稱、類名稱、常量名稱等等稱之為字面量,這些值用于執行時初始化變量、函數調用等等 * __變量分配情況__:與字面量類似,這里指的是當前opcodes定義了多少變量、臨時變量,每個變量都有一個對應的編號,執行初始化按照總的數目一次性分配zval,使用時也完全按照編號索引,而不是根據變量名索引 #### 3.3.1.3 zend_executor_globals `zend_executor_globals executor_globals`是PHP整個生命周期中最主要的一個結構,是一個全局變量,在main執行前分配(非ZTS下),直到PHP退出,它記錄著當前請求全部的信息,經常見到的一個宏`EG`操作的就是這個結構。 ```c //zend_compile.c #ifndef ZTS ZEND_API zend_compiler_globals compiler_globals; ZEND_API zend_executor_globals executor_globals; #endif //zend_globals_macros.h # define EG(v) (executor_globals.v) ``` `zend_executor_globals`結構非常大,定義在`zend_globals.h`中,比較重要的幾個字段含義如下圖所示: ![](https://box.kancloud.cn/dc6fee4115fea836048e332361ba7d7b_960x777.png) #### 3.3.1.4 zend_execute_data `zend_execute_data`是執行過程中最核心的一個結構,每次函數的調用、include/require、eval等都會生成一個新的結構,它表示當前的作用域、代碼的執行位置以及局部變量的分配等等,等同于機器碼執行過程中stack的角色,后面分析具體執行流程的時候會詳細分析其作用。 ```c #define EX(element) ((execute_data)->element) //zend_compile.h struct _zend_execute_data { const zend_op *opline; //指向當前執行的opcode,初始時指向zend_op_array起始位置 zend_execute_data *call; /* current call */ zval *return_value; //返回值指針 zend_function *func; //當前執行的函數(非函數調用時為空) zval This; //這個值并不僅僅是面向對象的this,還有另外兩個值也通過這個記錄:call_info + num_args,分別存在zval.u1.reserved、zval.u2.num_args zend_class_entry *called_scope; //當前call的類 zend_execute_data *prev_execute_data; //函數調用時指向調用位置作用空間 zend_array *symbol_table; //全局變量符號表 #if ZEND_EX_USE_RUN_TIME_CACHE void **run_time_cache; /* cache op_array->run_time_cache */ #endif #if ZEND_EX_USE_LITERALS zval *literals; //字面量數組,與func.op_array->literals相同 #endif }; ``` zend_execute_data與zend_op_array的關聯關系: ![](https://box.kancloud.cn/005c7ed47923adba803d0f313417ad5f_450x676.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看