PHP中,$a和$GLOBALS['a']在記憶體中的關係?

來源:互聯網
上載者:User
$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核心中其餘都是一模一樣的

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.