PHP語言中global和$GLOBALS[]的分…____PHP

來源:互聯網
上載者:User
PHP語言中global和$GLOBALS[]的分析 之二

還是借用上一篇的例子:

PHP代碼
 <?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的解釋:
如果在一個函數內部給一個聲明為 global 的變數賦於一個引用,該引用只在函數內部可見。可以通過使用 $GLOBALS 數組避免這一點。
我們都知道php中的函數所產生的變數都是函數的私人變數,那麼global關鍵字產生的變數也肯定逃不出這個規則,為什麼這麼說呢,看下面的代碼:
PHP代碼
 <?php 
 // 例子2 
 function test() { 
   global $a; 
   unset($a); 
 } 
 $a = 1; 
 test(); 
 print $a; 
 ?>  
執行結果為:
1
為什麼會輸出1呢。不是已經把$a給unset了嗎。unset失靈了。php的bug。
都不是,其實unset起作用了,是把test函數中的$a給unset掉了,可以在函數test()中加入
print $a;
來測試。
接著回到上面的例子1,看test_global中的這一代碼“$var2 =& $var1;”,上面是一個引用賦值運算,也就是$var2將指向var1所指向的實體記憶體地址,所以例子1執行過test_global函數以後,變數的變化只在函數的局部產生效應,在函數外部$var2的指向實體記憶體地址並沒有變化,還是它自己.
此時,就能理解為什麼例子1執行完以後,$var2是0,而$var3是5了。
所以我們得出一個結論,在函數中global和$GLOBALS[]的區別在於:
global在函數產生一個指向函數外部變數的別名變數,而不是真正的函數外部變數,一但改變了別名變數的指向地址,就會發生一些意料不到情況,例如例子 1.
$GLOBALS[]確確實實調用是外部的變數,函數內外會始終保持一致
可以對照 下面兩個列子再加深下印象:
global:
<?php
function myfunction(){
    global $bar;
    unset($bar);
}
$bar=”someting”;
myfunction();
echo $bar;
?>
輸出:someting
$GLOBALS[]:
<?php
    function foo()
{
    unset($GLOBALS['bar']);
}
$bar = “something”;
foo();
echo $bar;
?>
輸出:空
當按照上面的思路理解後,碰到下面的情況是不是又有些暈呢?
<?php
$a = 1;
$b = 2;
function Sum()
{
   global $a, $b;
   $b = $a + $b;
}
Sum();
echo $b;
?>
輸出將是 “3″。在函數中申明 了全域變數 $a 和 $b,任何變數的所有引用變數都會指向到全域變數。
怎麼不是2呢,在函數外部不是不影響嗎,請注意$b在函數中並沒有通過引用修改,而是修改的$b指向實體記憶體的值,因此外部輸入為3。 
 

聯繫我們

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