宣告:本文為斯人原創,全部為作者一一分析得之,有不對的地方望賜教。
好久沒有寫部落格了…最近事挺多,
換了工作,又搬了家..
今天就來說說 我們經常用到的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...