1:Global的作用是定義全域變數,但是這個全域變數不是應用於整個網站,而是應用於目前頁面,包括include或require的所有檔案。
<?php $a=123; function aa() { Global $a; //如果不把$a定义为global变量,函数体内是不能访问函数体外部的$a的,但是可以定义一个相同的名字$a,此时这个变量是局部变量,等同于C语言的局部变量,只能在函数体内部使用。 echo $a; } aa(); ?>
總結:在函數體內定義的global變數,函數體外可以使用,在函數體外定義的global變數不能在函數體內使用,
$global $a; $a=123; function f() { echo $a; //错误, } //再看看下面一例 function f() { global $a; $a=123; } f(); echo $a; //正确,可以使用
2: global問題解析:
question:我在config.inc.php中定義了一些變數($a),在別的檔案中函數外部include("config.inc.php"),函數內部需要使用這些變數$a,如果沒有聲明的話,echo $a是打印不出來任何東西的。因此聲明global $a,但是有很多函數和很多變量,總不能不斷重複的這樣聲明吧?有什麼好的解決辦法,請指著一點。
answer1:先在config.inc.php裡定義常數:define(常數名,常數值)
再在其他需要用到的地方require 'config.inc.php',
然後就能在這個文件裡直接使用這個常數了。
answer2:我也有辦法,就是定義數組,如$x[a],$x,那樣就只要聲明global $x一個了。
answer3:我試了你的這個方法,不行啊。
answer4:改你的php.ini檔。
3.一些Global和$GLOBALS 陣列的範例
範例:使用 global
<?php $w3sky = 1; $w3sky2 = 2; function Sum() { global $w3sky, $w3sky2;$w3sky2 = $w3sky + $w3sky2; }Sum(); echo $w3sky2; ?>
以上腳本的輸出將是「3」。在函數中申明了全域變數 $w3sky 和 $w3sky2,任何變數的所有引用變數都會指向到全域變數。對於函數能夠申明的全域變數的最大個數,PHP 沒有限制。
在全域範圍內存取變數的第二個辦法,是用特殊的 PHP 自訂 $GLOBALS 陣列。前面的例子可以寫成:
例子使用$GLOBALS 取代global
<?PHP $w3sky = 1; $w3sky2 = 2;function Sum() { $GLOBALS['w3sky'] = $GLOBALS['w3sky'] + $GLOBALS['w3sky2']; }Sum(); echo $w3sky2; ?>
在$GLOBALS 數組中,每一個變數為一個元素,鍵名對應變數名稱,值對應變量的內容。 $GLOBALS 之所以在全域範圍內存在,是因為 $GLOBALS 是一個超全域變數。以下範例顯示了超全域變數的用處:
範例示範超全域變數和作用域的範例
<?PHP function test_global() { // 大多数的 预定义变量 并不 "super",它们需要用 'global' 关键字来使它们在函数的本地区域中有效。 global $HTTP_POST_VARS;echo $HTTP_POST_VARS['name'];// Superglobals 在任何范围内都有效,它们并不需要 'global' 声明。Superglobals 是在 PHP 4.1.0 引入的。 echo $_POST['name']; } ?>
global 也就是說在一個檔案裡只要你宣告為global $db 那麼在宣告的下面你就可以引用這個$db了。
4.原來以為global和$GLOBALS除了寫法不一樣以為,其他都一樣,可是在實際應用中發現,2者的區別還是很大的!
先看下面的例子:
<?php // 例子1 function test_global() { global $var1, $var2; $var2 =& $var1; } function test_globals() { $GLOBALS['var3'] =& $GLOBALS['var1']; } $var1 = 5; $var2 = $var3 = 0; test_global(); print $var2 ."\n"; test_globals(); print $var3 ."\n"; ?>
執行結果為:
0 5
怎麼會這樣呢?不應該是2個5嗎?怎麼會出現1個0和1個5呢?
恩,我們保留以上問題,深入分析$GLOBALS和global的原理!
我們都知道變量其實是相應物理內存在代碼中的"代號",假設我們上面聲明的3個變量分配的內存如下圖表示:
引用php手冊的$GLOBALS的解釋:
Global 變數:$GLOBALS
注意: $GLOBALS 在PHP 3.0.0 及以後版本中適用。
由所有已定義全域變數所組成的陣列。變數名就是該數組的索引。
這是一個“superglobal”,或者可以描述為自動全域變數。
也就是說上面程式碼中的$var1和$GLOBALS['var1']是指的相同變量,而不是2個不同的變數!
下面來分析global到底做了什麼?
我們都知道php中的函數所產生的變數都是函數的私有變量,那麼global關鍵字產生的變數也一定逃不出這個規則,為什麼這麼說呢,看下面的程式碼:
<?php // 例子2 function test() { global $a; unset($a); } $a = 1; test(); print $a; ?>
執行結果為: 1
為什麼會輸出1呢?不是已經把$a給unset了嗎? unset失靈了? php的bug?
都不是,其實unset運作了,是把test函數中的$a給unset掉了,可以在函數後面加入
print $a;
複製程式碼 來測試!也就是說global產生了test函數外部$a的別名變數「$a」,而test_globals執行過以後,看變數的變化。
此時就能理解為什麼例子1執行完以後,$var2是0,而$var3是5了!
所以我們得出一個結論,在函數中global和$GLOBALS[]的區別在於:
global在函數產生一個指向函數外部變量的別名變量,而不是真正的函數外部變量,一但改變了別名變數的指向位址,就會發生一些意料不到情況(為什麼會印出結果為2呢?其實就是因為$var1的引用指向了$var2的引用位址。導致實質的值沒有改變。這時候只是指向$var1的指針指向了$var2的指針,只是指針指向變了一下,但是實質上根本就沒有改變$var2的值,因此$var2的值仍舊不會變化),例如例子1.
$GLOBALS []確實確實實調用是外部的變量,函數內外會始終保持一致!
以上是php中global和$GLOBALS[]的使用差異是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!