首頁  >  文章  >  後端開發  >  php中global和$GLOBALS[]的使用差異是什麼?

php中global和$GLOBALS[]的使用差異是什麼?

伊谢尔伦
伊谢尔伦原創
2017-06-21 17:34:032410瀏覽

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[&#39;w3sky&#39;] = $GLOBALS[&#39;w3sky&#39;] + $GLOBALS[&#39;w3sky2&#39;]; 
}Sum(); 
echo $w3sky2; 
?>

在$GLOBALS 數組中,每一個變數為一個元素,鍵名對應變數名稱,值對應變量的內容。 $GLOBALS 之所以在全域範圍內存在,是因為 $GLOBALS 是一個超全域變數。以下範例顯示了超全域​​變數的用處:
範例示範超全域變數和作用域的範例 

<?PHP 
function test_global() 
{ 
// 大多数的
预定义变量
并不 "super",它们需要用 &#39;global&#39; 关键字来使它们在函数的本地区域中有效。 
global $HTTP_POST_VARS;echo $HTTP_POST_VARS[&#39;name&#39;];// Superglobals 在任何范围内都有效,它们并不需要 &#39;global&#39; 声明。Superglobals 是在 PHP 4.1.0 引入的。 
echo $_POST[&#39;name&#39;]; 
} 
?>

global 也就是說在一個檔案裡只要你宣告為global $db 那麼在宣告的下面你就可以引用這個$db了。
4.原來以為global和$GLOBALS除了寫法不一樣以為,其他都一樣,可是在實際應用中發現,2者的區別還是很大的!
先看下面的例子: 

<?php 
// 例子1 
function test_global() { 
global $var1, $var2; 
$var2 =& $var1; 
} 
function test_globals() { 
$GLOBALS[&#39;var3&#39;] =& $GLOBALS[&#39;var1&#39;]; 
} 
$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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn