<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                通過前面章節的描述,我們已經知道了PHP中變量的存儲方式--所有的變量都保存在zval結構中。下面介紹一下PHP內核如何實現變量的定義方式以及作用域。 ## 變量的生命周期[]() 在ZE進行詞法和語法的分析之后,生成具體的opcode,這些opcode最終被execute函數(Zend/zend_vm_execute.h:46)解釋執行。在excute函數中,有以下代碼: while (1) { ? ... if ((ret = EX(opline)->handler(execute_data TSRMLS_CC)) > 0) { switch (ret) { case 1: EG(in_execution) = original_in_execution; return; case 2: op_array = EG(active_op_array); goto zend_vm_enter; case 3: execute_data = EG(current_execute_data); default: break; } } ... } 這里的EX(opline)->handler(...)將op_array中的操作順序執行,其中變量賦值操作在ZEND_ASSIGN_SPEC_CV_CONST_HANDLER()函數中進行。ZEND_ASSIGN_SPEC_CV_CONST_HANDLER中進行一些變量類型的判斷并在內存中分配一個zval,然后將變量的值存儲其中。變量名和指向這個zval的指針,則會存儲于符號表內。ZEND_ASSIGN_SPEC_CV_CONST_HANDLER的最后會調用ZEND_VM_NEXT_OPCODE()將op_array的指針移到下一條opline,這樣就會形成循環執行的效果。 在ZE執行的過程中,有四個全局的變量,這些變量都是用于ZE運行時所需信息的存儲: //_zend_compiler_globals 編譯時信息,包括函數表等 zend_compiler_globals *compiler_globals; //_zend_executor_globals 執行時信息 zend_executor_globals *executor_globals; //_php_core_globals 主要存儲php.ini內的信息 php_core_globals *core_globals; //_sapi_globals_struct SAPI的信息 sapi_globals_struct *sapi_globals; 在執行的過程中,變量名及指針主要存儲于_zend_executor_globals的符號表中,_zend_executor_globals的結構這樣的: struct _zend_executor_globals { ... /* symbol table cache */ HashTable *symtable_cache[SYMTABLE_CACHE_SIZE]; HashTable **symtable_cache_limit; HashTable **symtable_cache_ptr; ? zend_op **opline_ptr; ? HashTable *active_symbol_table; /* active symbol table */ HashTable symbol_table; /* main symbol table */ ? HashTable included_files; /* files already included */ ... ? } 在執行的過程中,active_symbol_table會根據執行的具體語句不斷發生變化(詳請見本節下半部分),針對線程安全的EG宏就是用來取此變量中的值。ZE將op_array執行完畢以后,HashTable會被FREE_HASHTABLE()釋放掉。 如果程序使用了unset語句來主動消毀變量,則會調用ZEND_UNSET_VAR_SPEC_CV_HANDLER來將變量銷毀,回收內存,這部分內存可以參考《第六章 內存管理》的內容。
                  <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>

                              哎呀哎呀视频在线观看