php中global和$GLOBALS[]的分析之一

來源:互聯網
上載者:User

這可能引起一些問題,有些人可能漫不經心的改變一個全域變數。PHP 中全域變數在函數中使用時必須申明為全域(注意,Global這個關鍵字在函數中定義才有用)。
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”,為了和外面的$a區別,我把它成為--test->$a,那麼例子1也這麼命名的話,可得出下面的圖:
而test_globals執行過以後,看變數的變化:
此時,看圖,就能理解為什麼例子1執行完以後,$var2是0,而$var3是5了!
所以我們得出一個結論,在函數中global和$GLOBALS[]的區別在於:
global在函數產生一個指向函數外部變數的別名變數,而不是真正的函數外部變數,一但改變了別名變數的指向地址,就會發生一些意料不到情況(為什麼會列印結果為2呢?其實就是因為$var1的引用指向了$var2的引用地址。導致實質的值沒有改變。這時候只是指向$var1的指標指向了$var2的指標,只是指標指向變了一下,但是實質上根本就沒有改變$var2的值,因此$var2的值仍舊不會變化),例如例子1.
$GLOBALS[]確確實實調用是外部的變數,函數內外會始終保持一致!
註:(接著回到上面的例子1,看test_global中的這一代碼“$var2 =& $var1;”,上面是一個引用賦值運算,也就是$var2將指向var1所指向的實體記憶體地址,所以例子1執行過test_global函數以後,變數的變化只在函數的局部產生效應,在函數外部$var2的指向實體記憶體地址並沒有變化,還是它自己.(重點)
接著回到上面的例子1,看test_global中的這一代碼“$var2 =& $var1;”,上面是一個引用賦值運算,也就是$var2將指向var1所指向的實體記憶體地址,所以例子1執行過test_global函數以後,變數的變化由可以看出)
這一篇分析的不夠透徹,不明白的請看《global和$GLOBALS[]的分析之二》其中舉一反三通俗易懂

相關文章

聯繫我們

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