php 全域性變數

2022-09-12 22:00:36 字數 2036 閱讀 7756

描述

php中把定義在函式、類之外的變數稱之為全域性變數,也就是定義在主指令碼中的變數,這些變數可以在函式、成員方法中通過global關鍵字引入使用。

1

function

test() 56

$id = 1;

7test();

8echo

$id;

儲存

全域性變數在整個請求執行期間始終存在,它們儲存在eg(symbol_table)中,也就是全域性變數符號表,與靜態變數的儲存一樣,這也是乙個雜湊表,主指令碼(或include、require)在zend_execute_ex執行開始之前會把當前作用域下的所有區域性變數新增到eg(symbol_table)

zend_vm_execute.h中,i_init_execute_data()這個函式中會把區域性變數插入到eg(symbol_table):

1 zend_api void zend_execute(zend_op_array *op_array, zval *return_value)

2

i_init_execute_data會把區域性變數插入到eg(symbol_table),定義在zend_execute.c
1

static zend_always_inline void i_init_code_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value) /*

15ex_load_run_time_cache(op_array);

16ex_load_literals(op_array);

1718 eg(current_execute_data) =execute_data;

19 }

zend_attach_symbol_table 把區域性變數插入到eg(symbol_table),定義在zend_execute_api.c中
1 zend_api void zend_attach_symbol_table(zend_execute_data *execute_data) /*

else

24 } else

28 zval_indirect(zv, var

);29 str++;//

指向下乙個區域性變數

30var++;

31 } while (str !=end);32}

33 }

注意區域性變數通過偏移量來訪問,而不是變數名

從上面的過程可以很直觀的看到,在執行前遍歷區域性變數,然後插入eg(symbol_table),eg(symbol_table)中的value直接指向區域性變數的zval,示例經過這一步的處理之後(此時區域性變數只是分配了zval,但還未初始化,所以是is_undef):

訪問

與靜態變數的訪問一樣,全域性變數也是將原來的值轉換為引用,然後在global匯入的作用域內建立乙個區域性變數指向該引用:

1

global

$id; //

相當於:$id = & eg(symbol_table)["id"];

銷毀

區域性變數如果沒有手動銷毀,那麼在函式執行結束時會將它們銷毀,而全域性變數則是在整個請求結束時才會銷毀,即使是我們直接在php指令碼中定義在函式外的那些變數。

1

void shutdown_destructors(void)2

6zend_try while (symbols != zend_hash_num_elements(&eg(symbol_table)));13}

14...

15 }

PHP 全域性變數

全域性變數用關鍵字 global,如宣告乙個全域性變數 global x 函式之外宣告的變數具有global作用域,只能在函式之外進行訪問 函式之內宣告的變數具有local作用域,只能在函式之內進行訪問 如果全域性變數要在函式之內進行訪問,需要在變數前加global,例如 x 5 全域性作用域 fu...

php學習筆記 全域性變數,超全域性變數

超全域性變數 它們可以在乙個指令碼的全部作用域中都可用。在函式或方法中無需執行global variable就可以訪問它們。globals 引用 全域性作用域中可用的 全部變數 globals index x 75 y 25 function addition addition echo z ser...

PHP中全域性變數和超全域性變數

自定義全域性變數的作用域為當前的指令碼檔案的任意位置 函式或者方法啊之類的 但是要想用它們必須先執行一下 global variable語句 variable為要使用的全域性變數 或者是使用 global 變數名字 來呼叫。超全域性變數作用於也是為當前的指令碼檔案的任意位置,在使用的時候無需先執行 ...