41 全域性變數Global

2021-07-11 10:53:23 字數 1945 閱讀 9821

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 ...