PHP語言中global和$GLOBALS[]的分析

          原來以為global和$GLOBALS除了寫法不一樣以為,其他都一樣,可是在實際應用中發(fā)現(xiàn),2者的區(qū)別還是很大的!
          先看下面的例子:
          1. <?php
          2. // 例子1
          3. function test_global() {
          4.   global $var1, $var2;
          5.   $var2 =& $var1;
          6. }

          7. function test_globals() {
          8.   $GLOBALS['var3'] =& $GLOBALS['var1'];
          9. }

          10. $var1 = 5;
          11. $var2 = $var3 = 0;

          12. test_global();
          13. print $var2 ."\n";

          14. test_globals();
          15. print $var3 ."\n";
          16. ?>
          復制代碼
          執(zhí)行結果為:
          0
          5
          怎么會這樣呢?不應該是2個5嗎?怎么會出現(xiàn)1個0和1個5呢?

          恩,我們保留以上問題,深入分析$GLOBALS和global的原理!
          引用php手冊的$GLOBALS的解釋:

          Global 變量:$GLOBALS
          注意: $GLOBALS 在 PHP 3.0.0 及以后版本中適用。

          由所有已定義全局變量組成的數(shù)組。變量名就是該數(shù)組的索引。

          這是一個“superglobal”,或者可以描述為自動全局變量。
          也就是說上面代碼中的$var1$GLOBALS['var1']是指的同一變量,而不是2個不同的變量!

          下面來分析global到底做了什么?

          我們都知道php中的函數(shù)所產生的變量都是函數(shù)的私有變量,那么global關鍵字產生的變量也肯定逃不出這個規(guī)則,為什么這么說呢,看下面的代碼:
          1. <?php
          2. // 例子2
          3. function test() {
          4.   global $a;
          5.   unset($a);
          6. }
          7. $a = 1;
          8. test();
          9. print $a;
          10. ?>
          復制代碼
          執(zhí)行結果為:
          1
          為什么會輸出1呢?不是已經把$a給unset了嗎?unset失靈了?php的bug?

          都不是,其實unset起作用了,是把test函數(shù)中的$a給unset掉了,可以在函數(shù)后面加入
          1. print $a;

          所以我們得出一個結論,在函數(shù)中global和$GLOBALS[]的區(qū)別在于:

          global在函數(shù)產生一個指向函數(shù)外部變量的別名變量,而不是真正的函數(shù)外部變量,一但改變了別名變量的指向地址,就會發(fā)生一些意料不到情況,例如例子1.

          $GLOBALS[]確確實實調用是外部的變量,函數(shù)內外會始終保持一致!

          posted on 2009-04-19 16:52 丁克設計 閱讀(192) 評論(0)  編輯  收藏 所屬分類: PHP技術文檔

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          留言簿(6)

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          主站蜘蛛池模板: 大名县| 津市市| 云和县| 扎鲁特旗| 古交市| 宁海县| 南皮县| 苏尼特右旗| 颍上县| 泰来县| 武川县| 温泉县| 明光市| 如东县| 水城县| 包头市| 云阳县| 饶阳县| 博爱县| 东乡族自治县| 安岳县| 昭苏县| 甘南县| 邵武市| 弥渡县| 津南区| 娄烦县| 阳曲县| 平湖市| 长宁区| 大余县| 浮梁县| 启东市| 乐清市| 原平市| 黑水县| 西平县| 板桥市| 紫阳县| 卢氏县| 和林格尔县|