PHP超全局變量$GLOBALS和global關鍵字

變量與作用域

php的變量分爲三類:局部變量,全局變量,靜態變量
同樣php的作用域分爲三類:1、local(局部作用域) 2、global(全局作用域) 3、static(靜態作用域)

local和global作用域
通常情況local和global作用域是容易混淆的,如何區分這兩種作用域呢?規則如下:

1、函數外部聲明的變量擁有全局作用域,只能在函數外部訪問。
2、函數內部聲明的變量擁有局部作用域,只能在函數內部訪問。

PHP生命週期中,定義在函數體外部的所謂全局變量,函數內部是不能直接獲得的。
對於類中的成員變量,類中函數必須使用$this->的方式訪問。

?php 
$var = '1'; //全局變量
function foo(){
    $var = '2';//局部變量,只是名字恰好與var相同
}
foo();
echo $var;
?>

很明顯打印的結果是:1

global關鍵字

我們經常會遇到一種情況,在函數外部聲明瞭一個全局變量後,我們想在函數內部訪問或者修改這一全局變量,這裏我們就需要使用一個叫global的關鍵字來實現。
global作用:在函數內創建一個局部變量,使用global關鍵字使其成爲全局變量的同名引用

我們需要藉助global關鍵字來實現,

<?php 
$var = '1';//全局變量
function foo(){
    global $var;//在函數內創建一個局部變量,使用global關鍵字使其成爲全局變量的同名引用
    $var = '2';
}
foo();
echo $var;
?>

打印的結果是:2

超全局變量$GLOBALS

在生成全局變量的時候,PHP 同時在名爲 $GLOBALS的數組中存儲了所有的全局變量。

第一段
<?php 
$var = '1';//全局變量,即$GLOBALS['var'] = '1'
function foo(){
    global $var; //**全局變量的引用,即 $var = &$GLOBALS['var']**
    $var = '2';
    unset($var);
}
foo();
echo $var;
?>
打印結果是:2

我們知道global是生成一個全局變量的別名引用(類似於桌面上一個文件跟它的快捷方式)。引用的值修改後,全局變量的值也就修改了,在第一段代碼中,修改了快捷方式的內容,原文件的內容也得到了修改,然後又刪除了快捷方式(unset($var)😉,所以結果是修改後的值。

第二段
<?php 
$var = '1';//全局變量,即$GLOBALS['var'] = '1'
function foo(){
    global $var; //全局變量的引用,即 $var = &$GLOBALS['var']
    unset($var);
    $var = '2';
}
foo();
echo $var;
?>
打印結果是:1

第二段代碼中,在var=2;使unset(var = '2';之前使用了unset(var);方法銷燬了引用變量,所以導致全局的變量值並未修改。

再看一段代碼

第三段
<?php 
$var = '1';//全局變量,即$GLOBALS['var'] = '1'
function foo(){
    global $var; //全局變量的引用,即 $var = &$GLOBALS['var']
    unset($GLOBALS['var']);
    $var = '2';
    //或者在此調用unset($GLOBALS['var']);
}
foo();
echo $var;
?>
打印結果都是空

因爲全局變量銷燬了,引用也銷燬了(原文件沒了,快捷方式也沒了)

參考:
PHP學習之global變量
PHP中超全局變量$GLOBALS和global的區別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章