php語言

當前位置 /首頁/計算機/php語言/列表

php核心分析之zend-compile

學習PHP的時候也許你會用到關於PHP核心方面的知識,以下是本站小編精心為大家整理的php核心分析之zend_compile,希望對大家有所幫助!更多內容請關注應屆畢業生網!

php核心分析之zend-compile

這裡閱讀的php版本為PHP-7.1.0 RC3,閱讀程式碼的平臺為linux

  回到之前看的zend_evAL_stringl

ZEND_API int zend_eval_stringl(char *str, size_t str_len, zval *retval_ptr, char *string_name) /* {{{ */

{

...

new_op_array = zend_compile_string(&pv, string_name); // 這個是把php程式碼編譯成為opcode的過程

...

zend_execute(new_op_array, &local_retval); // 這個是具體的執行過程,執行opcode,把結果儲存到local_retval中

...

retval = SUCCESS;

return retval;

}

這裡的`zend_execute執行了兩步,第一步是把php編譯解析成為opcode的過程,我們就先看這個。

  zend_compile_string

zend_compile_string函式追下去可以追到compile_string

// 將一個字串解析成為op_array

zend_op_array *compile_string(zval *source_string, char *filename)

{

zend_lex_state original_lex_state;

zend_op_array *op_array = NULL;

zval tmp;

// 如果傳進來要解析的字元為空,則返回null

if (Z_STRLEN_P(source_string)==0) {

return NULL;

}

ZVAL_DUP(&tmp, source_string); // 複製source_string到zval中

convert_to_string(&tmp); // 如果不是字元型別就轉換為字元型別

source_string = &tmp;

zend_save_lexical_state(&original_lex_state); // 儲存lex上下文

if (zend_prepare_string_for_scanning(source_string, filename) == SUCCESS) { // 做編譯前的準備

BEGIN(ST_IN_SCRIPTING); // 設定狀態為正在編譯

op_array = zend_compile(ZEND_EVAL_CODE); // 進行編譯,並把生成結果放在op_array中

}

zend_restore_lexical_state(&original_lex_state); // 恢復lex上下文

zval_dtor(&tmp); // 釋放tmp

return op_array;

}

裡面最核心的就是zend_compile了。這裡的幾個點可以看看:

1 這麼做型別轉換,參考convert_to_string。這個函式就是把任意型別的值轉換為zval的string型別。

2 zval_dtor,這個函式是能把任意的zval變數做回收。非常好用。

3 ZVAL_DUP,是進行復制,它和ZVAL_COPY的區別在於是否增加gc的引用計數。

下面又找到關鍵點:zend_compi

TAG標籤:PHP 核心 compile zend #