搜尋
首頁php教程php手册原:PHP内核函数研究之 global

原:PHP内核函数研究之 global

Jun 06, 2016 pm 07:57 PM
globalphp核心函數部落格聲明研究

声明:本文为斯人原创,全部为作者一一分析得之,有不对的地方望赐教。 http://imsiren.com/archives/601 好久没有写博客了…最近事挺多, 换了工作,又搬了家.. 今天就来说说 我们经常用到的global语句吧.. 我们都知道,在函数体内声明的变量,作用域只是当前函

声明:本文为斯人原创,全部为作者一一分析得之,有不对的地方望赐教。

http://imsiren.com/archives/601


好久没有写博客了…最近事挺多,
换了工作,又搬了家..
今天就来说说 我们经常用到的global语句吧..
我们都知道,在函数体内声明的变量,作用域只是当前函数体中,一般情况下是访问不到外部声明的变量的.
因为全局变量和局部变量存放在不同的hashTable,
全局变量在symbol_table中,而局部变量则存在active_symbol_table中.
这样就将它们分开了,那 global是怎么实现的呢?
经过简单分析,通过RE2C&&YACC定位到 global的token

T_GLOBAL global_var_list ';'
................
global_var_list:
                global_var_list ',' global_var  { zend_do_fetch_global_variable(&$3, NULL, ZEND_FETCH_GLOBAL_LOCK TSRMLS_CC); }
        |       global_var                                              { zend_do_fetch_global_variable(&$1, NULL, ZEND_FETCH_GLOBAL_LOCK TSRMLS_CC); }
;

重点是在zend_do_fetch_global_variable这个函数中,我们进去看看,
void zend_do_fetch_global_variable(znode * varname,const znode * static_assignment,int
    fetch_type TSRMLS_DC) /* {{{ */ {
    zend_op * opline;
    znode lval;
    znode result;
    if(varname->op_type == IS_CONST) {
        if(Z_TYPE(varname->u . constant) != IS_STRING) {
            convert_to_string(&varname->u . constant);
        }
    }
    opline = get_next_op(CG(active_op_array)TSRMLS_CC);
    opline->opcode = ZEND_FETCH_W;
     /* the default mode must be Write, since fetch_simple_variable() is used to define function arguments */
    opline->result . op_type = IS_VAR;
    opline->result . u . EA . type = 0;
    opline->result . u . var = get_temporary_variable(CG(active_op_array));
    opline->op1 = * varname;
    SET_UNUSED(opline->op2);
    opline->op2 . u . EA . type = fetch_type;
    result = opline->result;
    if(varname->op_type == IS_CONST) {
        zval_copy_ctor(&varname->u . constant);
    }
    fetch_simple_variable(&lval,varname,0TSRMLS_CC);
     /* Relies on the fact that the default fetch is BP_VAR_W */
    zend_do_assign_ref(NULL,&lval,&result TSRMLS_CC);
    CG(active_op_array)->opcodes[CG(active_op_array)->last - 1] . result . u . EA . type |=
        EXT_TYPE_UNUSED;
}

1:此函数先验证我们获取的变量是否是常量,如果是常量并且不是字符串类型,则就将它转换成string类型.
2:此函数生成一个Op , ZEND_FETCH_W
3:释放CONST
4:fetch_simple_variable会检测是不是auto_global
最重要的地方是 ZEND_FETCH_W
通过计算 可以知道 op的函数是ZEND_FETCH_W_SPEC_CV_HANDLER


static int ZEND_FASTCALL  ZEND_FETCH_W_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
        return zend_fetch_var_address_helper_SPEC_CV(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}

zend_fetch_var_address_helper_SPEC_CV的工作:
1:转换成IS_STRING类型
2:如果是类的静态成员,则通过::获取过来,否则,通过zend_get_target_symbol_table函数返回全局变量symbol_table .
return &EG(symbol_table);
3:通过zend_hash_find 在 target_symbol_table 中查找,target_symbol_table是一个临时HashTable.用来存放 symbol_table的数据.
4: 如果没有找到,则会以写的方式 创建一条数据到target_symbol_table中.这就是,我们为什么通过global一个不存在的变量的时候不出错,并且会创建该变量的原因.

http://imsiren.com/archives/601
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境