首頁  >  文章  >  後端開發  >  global與$GLOBAL['']的一些不同理解

global與$GLOBAL['']的一些不同理解

伊谢尔伦
伊谢尔伦原創
2017-01-16 14:55:201970瀏覽

PHP 中全域變數在函數中使用時必須申明為全域(Global這個關鍵字在函數中定義才有用)。 

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; //正确,可以使用

舉例比較:

<?php 
$var1 = 1; 
function test(){ 
unset($GLOBALS[&#39;var1&#39;]); 
} 
test(); 
echo $var1; 
?>

因為$var1被刪除了,所以什麼東西都沒印。 

<?php 
$var1 = 1; 
function test(){ 
global $var1; 
unset($var1); 
} 
test(); 
echo $var1; 
?>

意外的印刷了1。證明刪除的只是別名引用,本身的值並沒有受到任何的改變。 

global $var其實就是&$GLOBALS['var'],呼叫外部變數的一個別名而已。 
上面程式碼中的$var1和$GLOBALS['var1']是指的相同變量,而不是兩個不同的變數。 
PHP的全域變數和C語言有一點點不同。在C語言中,全域變數在函數中主動生效,除非被局部變數籠罩。這可能引起一些問題,有些人可能漫不經心的轉變一個全域變數。 PHP中全域變數在函數中應用時必須用global申明為全域。 
PHP的Global變數的作用是定義全域變量,但是這個全域變數不是應用於整個網站,而是應用於目前頁面,包括include或require的所有檔案。 

引用php手冊的$GLOBALS的解釋:

Global 變數:$GLOBALS,注意: $GLOBALS 在 PHP 3.0.0 及以後版本中適用。

由所有已定義全域變數組成的陣列。變數名就是該數組的索引。這是一個“superglobal”,或者可以描述為自動全域變數。

也就是說上面程式碼中的$var1和$GLOBALS['var1']是指的相同變量,而不是2個不同的變數!

如果在一個函數內部給一個宣告為 global 的變數賦於一個引用,該引用只在函數內部可見。可以透過使用 $GLOBALS 陣列來避免這一點。

我們都知道php中的函數所產生的變數都是函數的私有變量,那麼global關鍵字產生的變數也肯定逃不出這個規則,global在函數產生一個指向函數外部變數的別名變量,而不是真正的函數外部變量,一但改變了別名變量的指向地址,就會發生一些意料不到情況,$GLOBALS[]確確實實調用是外部的變量,函數內外會始終保持一致。

<?php    
$a = 1;    
$b = 2;    
function Sum()
{    
global $a, $b;    
$b = $a + $b;    
}    
Sum();    
echo $b;    
?>

輸出將是 “3″。在函數中申明 了全域變數 $a 和 $b,任何變數的所有引用變數都會指向到全域變數。

怎麼不是2呢,在函數外部不是不影響嗎,請注意$b在函數中並沒有透過引用修改,而是修改的$b指向物理記憶體的值,因此外部輸入為3。

所以我們得出一個結論,在函數中global和$GLOBALS[]的區別在於: 

global在函數產生一個指向函數外部變量的別名變量,而不是真正的函數外部變量,一但改變了別名變數的指向地址,就會發生一些意料不到情況。

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

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