global和 GLOBALS 的分析之一

2021-06-17 20:52:57 字數 3975 閱讀 4478

php 的全域性變數和 c 語言有一點點不同,在 c 語言中,全域性變數在函式中自動生效,除非被區域性變數覆蓋。這可能引起一些問題,有些人可能漫不經心的改變乙個全域性變數。php 中全域性變數在函式中使用時必須申明為全域性(注意,global這個關鍵字在函式中定義才有用)。

1:global的作用是定義全域性變數,但是這個全域性變數不是應用於整個**,而是應用於當前頁面,包括include或require的所有檔案。

<?php

$a=123;

function aa()

aa();

?>

總結:在函式體內定義的global變數,函式體外可以使用,在函式體外定義的global變數不能在函式體內使用。

$global $a;

$a=123;

function f()

//再看看下面一例

function f()

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()

sum();

echo $w3sky2;

?>

以上指令碼的輸出將是「3」。在函式中申明了全域性變數 $w3sky 和 $w3sky2,任何變數的所有引用變數都會指向到全域性變數。對於乙個函式能夠申明的全域性變數的最大個數,php 沒有限制。

在全域性範圍內訪問變數的第二個辦法,是用特殊的 php 自定義 $globals 陣列。前面的例子可以寫成:

例子 使用 $globals 替代 global

<?php

$w3sky = 1;

$w3sky2 = 2;function sum()

sum();

echo $w3sky2;

?>

在 $globals 陣列中,每乙個變數為乙個元素,鍵名對應變數名,值對應變數的內容。$globals 之所以在全域性範圍內存在,是因為 $globals 是乙個超全域性變數。以下範例顯示了超全域性變數的用處:

例子 演示超全域性變數和作用域的例子

<?php

function test_global()

?>

global 也就是說在乙個檔案裡 只要你宣告為global $db 那麼在宣告的下面 你就可以引用這個$db了。

4.原來以為global和$globals除了寫法不一樣以為,其他都一樣,可是在實際應用中發現,2者的區別還是很大的!

先看下面的例子:

1. <?php

2. // 例子1

3. function test_global()

7.8. function test_globals()

11.12. $var1 = 5;

13. $var2 = $var3 = 0;

14.15. test_global();

16. print $var2 ."\n";

17.18. test_globals();

19. print $var3 ."\n";

20. ?>

複製**

執行結果為: 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關鍵字產生的變數也肯定逃不出這個規則,為什麼這麼說呢,看下面的**:

1. <?php

2. // 例子2

3. function test()

7. $a = 1;

8. test();

9. print $a;

10. ?>

複製**

執行結果為: 1

為什麼會輸出1呢?不是已經把$a給unset了嗎?unset失靈了?php的bug?

都不是,其實unset起作用了,是把test函式中的$a給unset掉了,可以在函式後面加入

1. 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的分析之二》其中舉一反三通俗易懂

PHP中 GLOBALS和global的區別

php 中的許多預定義變數都是 超全域性的 這意味著它們在乙個指令碼的全部作用域中都可用。在函式或方法中無需執行 global variable 就可以訪問它們。這些超全域性變數是 1 globals 引用全域性作用域中可用的全部變數。2 乙個包含了全部變數的全域性組合陣列。變數的名字就是陣列的鍵。...

php中global和 GLOBALS 的分析

global問題 php裡面的global的使用。如下例子 name even 定義變數name,並初始化 function echoname echoname 分析 上面的 的結果為 myname is 而不是期望中的 myname is even 因為函式沒有傳遞引數 name的值,企圖引用外部...

全域性變數 global和 GLOBALS 的區別

global在函式內產生乙個指向函式外部變數的別名變數 指向外部變數的引用 而不是真正的函式外部變數 globals確確實實呼叫是外部的變數,函式內外會始終保持一致!function test global function test globals var1 5 var2 var3 0 test ...