global語句的作用是定義全域性變數,例如如果想在函式內訪問全域性作用域內的變數則可以通過global宣告來定義。 下面從語法解釋開始分析。
檢視 zend/zend_language_scanner.l檔案,搜尋 global關鍵字。我們可以找到如下**:
"global"
| t_global global_var_list ';'
global_var_list:
global_var_list ',' global_var
| global_var
;
上面**中的$3是指global_var(如果不清楚yacc的語法,可以查閱yacc入門類的文章。)
從上面的**可以知道,對於全域性變數的宣告呼叫的是zend_do_fetch_global_variable函式,查詢此函式的實現在zend/zend_compile.c檔案。
void zend_do_fetch_global_variable(znode *varname, const znode *static_assignment, int fetch_type tsrmls_dc)
/* }}} */
上面的**確認了opcode為zend_fetch_w外,還執行了zend_do_assign_ref函式。zend_do_assign_ref函式的實現如下:
void zend_do_assign_ref(znode *result, const znode *lvar, const znode *rvar tsrmls_dc) /* else
opline->op1 = *lvar;
opline->op2 = *rvar;
}
從上面的zend_do_fetch_global_variable函式和zend_do_assign_ref函式的實現可以看出, 使用global宣告乙個全域性變數後,其執行了兩步操作,zend_fetch_w和zend_assign_ref。
我們看下zend_fetch_w的最後執行。從**中我們可以知道:
而計算最後呼叫的方法在**中的體現為:
zend_opcode_handlers[opcode * 25 + zend_vm_decode[op->op1.op_type] * 5 + zend_vm_decode[op->op2.op_type]];
計算,最後呼叫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中呼叫如下**獲取符號表
target_symbol_table = zend_get_target_symbol_table(opline, ex(ts), type, varname tsrmls_cc);
在zend_get_target_symbol_table函式的實現如下:
static inline hashtable *zend_get_target_symbol_table(const zend_op *opline, const temp_variable *ts, int type, const zval *variable tsrmls_dc)
return null;
}
在前面語法分析過程中,程式傳遞的引數是 zend_fetch_global_lock,於是如上所示。我們取&eg(symbol_table);的值。這也是全域性變數的存放位置。
如上就是整個global的解析過程。
PHP全域性變數global與 GLOBAL詳解
總結 a 1全域性變數相當於有3個變數,函式外部的變數,函式內部的變數,及 global的超全域性變數。global是全域性唯一的,而 var在為全域性變數的別名。b 無論函式內部外部,只要曾經宣告過全域性變數,則 global為全域性的,無需再次宣告 c 在函式內部unset var1 不會影響外...
PHP全域性變數global與 GLOBAL詳解
一 乙個全域性變數相當於有3個變數,函式外部的變數,函式內部的變數,及 global的超全域性變數 global是全域性唯一的,而 var在為全域性變數的別名。二 無論函式內部外部,只要曾經宣告過全域性變數,則 global為全域性的,無需再次宣告 三 在函式內部unset var1 不會影響外部的...
全域性變數global與超全域性變數 GLOBALS
出錯行 mysqli query link,select from sys calendar where id id link為連線資料庫,此處為空。解決方法 link不能從global獲取,改為 globals link mysqli query globals link select from ...