php中global 與 $GLOBALS[""] 的區別_PHP教程

來源:互聯網
上載者:User
php中global 與 $GLOBALS[""] 差別 原本覺得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的原理!

我們都知道變數其實是相應實體記憶體在代碼中的"代號",

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

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

由所有已定義全域變數組成的數組。變數名就是該數組的索引。

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

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

我們都知道PHP中的函數所產生 的變數都是函數的私人變數,那麼global產生的變數也確定逃不出這個規矩,為什麼這麼說呢,看下面的代碼:
PHP代碼

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”,為了和外面的$a差別

接著回到上面的例子1,看test_global中的這一代碼“$var2 =& $var1;”,上面是一個引用賦值運算,也就是$var2將指向var1所指向的實體記憶體地址

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

global在函數產生 一個指向函數外部變數的別名 變數,而不是真正的函數外部變數,一但轉變了別名 變數的指向地址,就會產生一些意料不到情況 ,例如例子1.

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

可以對照 下面兩個列子:

global:

function myfunction(){
global $bar;
unset($bar);
}
$bar="someting";
myfunction();
echo $bar;
?>

輸出:someting

$global[]:

function foo()
{
unset($GLOBALS['bar']);
}

$bar = "something";
foo();
echo $bar;
?>

輸出:空

PHP 的全域變數和 C 語言有一點點不同,在 C 語言中,全域變數在函數中主動生效,除非被局部變數籠罩。這可能引起一些問題,有些人可能漫不經心的轉變一個全域變數。PHP 中全域變數在函數中應用時必須 申明 為全域。
應用 global的例子
$a = 1;
$b = 2;

function Sum()
{
global $a, $b;

$b = $a + $b;
}

Sum();
echo $b;
?>
以上指令碼的輸出將是 "3"。在函數中申明 了全域變數 $a 和 $b,任何變數的所有引用變數都會指向到全域變數

http://www.bkjia.com/PHPjc/477391.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/477391.htmlTechArticlephp中global 與 $GLOBALS[] 差別 原本覺得global和$GLOBALS除了寫法不一樣覺得,其他都一樣,可是在實際利用中發現2者的差別還是很大的! 先看下面的...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.