原 PHP核心函式研究之 global

2021-06-06 19:41:31 字數 2410 閱讀 8594

宣告:本文為斯人原創,全部為作者一一分析得之,有不對的地方望賜教。

好久沒有寫部落格了…最近事挺多,

換了工作,又搬了家..

今天就來說說 我們經常用到的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

| global_var

;

重點是在zend_do_fetch_global_variable這個函式中,我們進去看看,

void zend_do_fetch_global_variable(znode * varname,const znode * static_assignment,int

fetch_type tsrmls_dc) /*

}opline = get_next_op(cg(active_op_array)tsrmls_cc);

opline->opcode = zend_fetch_w;

/* the default mode must be write, since fetch_******_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)

fetch_******_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_******_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)

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乙個不存在的變數的時候不出錯,並且會建立該變數的原因.

原文出處:

原 PHP核心研究 函式的定義

宣告 本文為斯人原創,全部為作者一一分析得之,有不對的地方望賜教。php技術部落格 在csdn也會同步更新的哦.php中,函式的定義 是用關鍵字 function來定義的.function hello str 在 zend zend language parse.y中找到 關鍵字 t functio...

PHP核心函式研究之 intval

宣告 本文為斯人 原創,全部為作者一一分析得之,有不對的地方望賜教。趁熱打鐵 順便說說 intval函式.該函式好像我們用的最多的就是在post或者get某個引數的時候,將其強制轉換為int型,為了保證我們傳入到sql的時候是乙個整形.當然這只是其中一種用法.該函式接受兩個引數,第乙個是要轉換的字串...

PHP 核心特性之匿名函式

提出 在匿名函式出現之前,所有的函式都需要先命名才能使用 function increment value array map increment 1,2,3 有的時候函式可能只需要使用一次,這時候使用匿名函式會使得 更加簡潔直觀,同時也避免了函式在其他地方被使用 array map functio...