$a=4;unset($GLOBALS['a']);var_dump($a);
$a和$GLOBALS['a']在記憶體中的關係是怎樣的
肯定不是這樣的
如果是這樣的話unset($GLOBALS['a']) $a應該還是存在的
求解,非常感謝諸位
回複內容:
$a=4;unset($GLOBALS['a']);var_dump($a);
$a和$GLOBALS['a']在記憶體中的關係是怎樣的
肯定不是這樣的
如果是這樣的話unset($GLOBALS['a']) $a應該還是存在的
求解,非常感謝諸位
GLOBALS是個超全域變數,本身是個關聯陣列,所有的全域變數都是它下面的一個索引值對
所以
在函數外面執行,unset($GLOBALS['a']);
和unset($a);
是完全等價的
在函數內執行,則需要考慮範圍的問題,如果你通過global $a;
引入了這個環境變數,則在函數內執行unset($GLOBALS['a']);
也照樣會影響到函數內$a
的訪問和使用
見
http://php.net/manual/zh/reserved.variables.globals.php
補充內容
關於評論中題主疑惑的記憶體的問題,是這樣的,不能以C的變數和指標的形式來理解這兩個變數之間的關係。PHP在拿到你的變數名之後,是去當前內容相關的符號表(是個雜湊表)中去尋找具體的地址,所以如果你是在函數外,你的當前內容相關的符號表本身就是GLOBALS的那個指向的儲存全域符號雜湊表,你可以通過閱讀php源碼中的zend.c和zend_compile.c來瞭解zend引擎對於全域變數的處理
首先你需要弄清 unset
的作用機制;它在函數中執行和函數外執行是不一樣的;
詳細參見unset
按照你的代碼執行,unset
會同時銷毀 $a
和 $GLOBALS['a']
;
但是 $a
和 $GLOBALS['a']
是兩個獨立的變數,並不是引用,一個是普通變數,一個是全域變數
局部變數儲存在active_symbol_table
全域變數儲存在symbol_table
局部變數和全域變數除了儲存在不同的符號表中,在php核心中其餘都是一模一樣的