PHP Global與$GLOBALS變數範圍與區別

來源:互聯網
上載者:User

Global,全域變數

  PHP Global變數在實際應用中會發現許多問題需要我們不斷的去完善處理。我們在這篇文章中就針對PHP Global變數出現的問題給出了一些具體的解決辦法。

PHP hack的提示詳解
代碼實現PHP GTK寫文本查看器
網站開發中PHP語言優缺點
如何正確實現PHP function函數擴充
PHP error_log()函數處理錯誤記錄檔

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

 代碼如下 複製代碼

$a=123;
 
function aa()
{
Global $a; 
//如果不把$a定義為global變數
,函數體內是不能訪問$a的
echo $a;
}
aa();

總結:

在函數體內定義的PHP Global變數,函數體外可以使用,在函數體外定義的global變數不能在函數體內使用,

 

 代碼如下 複製代碼
$glpbal $a; 
$a=123;  
function f() 

echo $a; //錯誤, 
}

再看看下面一例

 代碼如下 複製代碼


function f() 

global $a;  $a=123; 
}  
f(); 
echo $a;

//正確,可以使用

2:PHP 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檔案。

設定PHP Global變數 為 on


,下面我們看看複雜點的:

 代碼如下 複製代碼

//A.php 檔案

<?php
function Test_Global()
{
    include 'B.php';
    Test();
}

$a = 0 ;
Test_Global();
echo $a;
?>

//B.php 檔案

<?php
function Test()
{
   global $a;//申明函數體Sum內使用的$a變數為global全域變數
   $a =1;
}
?>

為什麼輸出的卻是0?!!

在使用者自訂函數中,一個局部函數範圍將被引入。任何用於函數內部的變數按預設情況將被限制在局部函數範圍內(包括include 和 require 匯入的檔案內的變數)!
解釋:A.php檔案的內Test_Global是定義好的第三方函數,該函數用include匯入了B.php檔案內的$a的global全域變數,所以$a被限制在Test_Global局部函數範圍內,所以B.php檔案內的$a的作用範圍都在Test_Global內,而不是作用了整個A.php內….

解決方案:
1. 衝出局部函數

 代碼如下 複製代碼

//A.php 檔案

<?php
function Test_Global()
{
    Test();
}
include 'B.php'; //將include 從局部Test_Global函數中移出
$a = 0 ;
Test_Global();
echo $a;
?>

//B.php 檔案

<?php
function Test()
{
    global $a;
    $a =1;
}
?>


global和$GLOBALS的區別


php中global和$GLOBALS不僅僅是寫法不一樣以為,2者的區別還是很大的,在實際應用中需要注意!

先看下面的例子:

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。

php中global和$GLOBALS不僅僅是寫法不一樣以為,2者的區別還是很大的,在實際應用中需要注意!

先看下面的例子:

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.