php中global 與 $globals[""] 差別 原本覺得global和$globals除了寫法不一樣覺得,其他都一樣,可是在實際利用中發現2者的差別還是很大的!
先看下面的例子:
php**
<?php
// 例子1
function test_global()
function test_globals()
$var1 = 5;
$var2 = $var3 = 0;
test_global();
print $var2 ."n";
test_globals();
print $var3 ."n";
?>
履行效果為:05
怎麼會這樣呢?不該當是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**
<?php
function test()
$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:
<?php
function myfunction()
$bar="someting";
myfunction();
echo $bar;
?>
輸出:someting
$global:
<?php
function foo()
$bar = "something";
foo();
echo $bar;
?>
輸出:空
php 的全域性變數和 c 語言有一點點不同,在 c 語言中,全域性變數在函式中主動生效,除非被區域性變數籠罩。這可能引起一些問題,有些人可能漫不經心的轉變乙個全域性變數。php 中全域性變數在函式中應用時必須 申明 為全域性。
應用 global的例子
<?php
$a = 1;
$b = 2;
function sum()
sum();
echo $b;
?>
以上指令碼的輸出將是 "3"。在函式中申明 了全域性變數 $a 和 $b,任何變數的所有引用變數都會指向到全域性變數
php中global與 GLOBAL的用法及區別
php中global 與 globals 差別 原本覺得global和 globals除了寫法不一樣覺得,其他都一樣,可是在實際利用中發現2者的差別還是很大的 先看下面的例子 php 例子1 function test global function test globals var1 5 var2...
PHP中global與 GLOBALS 區別
根據官方的解釋是 1.globals var 是外部的全域性變數本身。2.global var是外部 var的同名引用或者指標。舉例說明一下 var1 1 var2 2 function test test echo var2 正常列印結果為1 var1 1 var2 2 function test...
PHP全域性變數global與 GLOBAL詳解
總結 a 1全域性變數相當於有3個變數,函式外部的變數,函式內部的變數,及 global的超全域性變數。global是全域性唯一的,而 var在為全域性變數的別名。b 無論函式內部外部,只要曾經宣告過全域性變數,則 global為全域性的,無需再次宣告 c 在函式內部unset var1 不會影響外...