php的類有全域性變數嗎 php 全域性變數

2021-10-22 21:05:22 字數 1606 閱讀 2093

描述

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

1 functiontest() 5

6 $id = 1;7 test();8 echo $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) /*15 ex_load_run_time_cache(op_array);16 ex_load_literals(op_array);17

18 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) /* else24 } else28 zval_indirect(zv, var);29 str++;//指向下乙個區域性變數

30 var++;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 6 zend_try {7 uint32_t symbols;8 do{9 symbols = zend_hash_num_elements(&eg(symbol_table));10 //銷毀

PHP 全域性變數

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

php 全域性變數

描述 php中把定義在函式 類之外的變數稱之為全域性變數,也就是定義在主指令碼中的變數,這些變數可以在函式 成員方法中通過global關鍵字引入使用。1 function test 56 id 1 7test 8echo id 儲存 全域性變數在整個請求執行期間始終存在,它們儲存在eg symbol...

PHP 超全域性變數

globals 包含乙個引用指向每個當前指令碼的全域性範圍內有效的變數。該陣列的鍵名為全域性變數的名稱。從 php 3 開始存在 globals 陣列。server 變數由 web 伺服器設定或者直接與當前指令碼的執行環境相關聯。類似於舊陣列 http server vars 陣列 依然有效,但反對...