PHP學(xué)習(xí)之global變量

php的變量分為三類:局部變量,全局變量,靜態(tài)變量
在一段php腳本中<?php >,變量可以在任意位置聲明,作用域的意思是指變量在腳本中的使用范圍。
同樣php的作用域分為三類:1、local(局部作用域) 2、global(全局作用域) 3、static(靜態(tài)作用域)

local和global作用域

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

1、函數(shù)外部聲明的變量擁有全局作用域,只能在函數(shù)外部訪問。
2、函數(shù)內(nèi)部聲明的變量擁有局部作用域,只能在函數(shù)內(nèi)部訪問。

請看下面一段

<?php 
$var = '1'; //全局變量
function foo(){
    $var = '2';//局部變量
}
foo();
echo $var;
?>
很明顯打印的結(jié)果是:1

雖然兩個變量名都叫var,但是確實(shí)完全不同的兩個變量,也是兩種不同的作用域,打印出的很明顯是全局的變量。

global關(guān)鍵字

我們經(jīng)常會遇到一種情況,在函數(shù)外部聲明了一個全局變量后,我們想在函數(shù)內(nèi)部訪問或者修改這一全局變量,這里我們就需要使用一個叫g(shù)lobal的關(guān)鍵字來實(shí)現(xiàn)。

還用剛剛那段代碼,我們想在foo()函數(shù)內(nèi)部修改$var的值,像上面那樣寫法肯定是不行,

function foo(){ 
    $var = '2';//這里只是相當(dāng)于重新定義一個局部變量,只不過名字恰好跟var是相同的
}

我們需要借助global關(guān)鍵字來實(shí)現(xiàn),

<?php 
$var = '1';//全局變量
function foo(){
    global $var;//在函數(shù)內(nèi)創(chuàng)建一個局部變量,使用global關(guān)鍵字使其成為全局變量的同名引用
    $var = '2';
}
foo();
echo $var;
?>
打印的結(jié)果是:2

$GLOBALS

說到global關(guān)鍵字,就不得不提$GLOBALS,$GLOBALS是超全局變量,在生成全局變量的時候,PHP 同時在名為 $GLOBALS的數(shù)組中存儲了所有的全局變量。

<?php 
$var = '1';//全局變量,即$GLOBALS['var'] = '1'
function foo(){
    global $var; //全局變量的引用,即 $var = &$GLOBALS['var']
    $var = '2';
}
foo();
echo $var;
?>

有興趣的童鞋可以打印下var_dump($GLOBALS);看看結(jié)果。
結(jié)合unset()方法會更容易理解,看如下兩段代碼

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

因?yàn)槲覀冎纆lobal是生成一個全局變量的別名引用(類似于桌面上一個文件跟它的快捷方式)。引用的值修改后,全局變量的值也就修改了,在第一段代碼中,修改了快捷方式的內(nèi)容,原文件的內(nèi)容也得到了修改,然后又刪除了快捷方式(unset($var);),所以結(jié)果是修改后的值。
但是在第二段代碼中,在$var = '2';之前使用了unset($var);方法銷毀了引用變量,所以導(dǎo)致全局的變量值并未修改。

再看一段代碼

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

因?yàn)槿肿兞夸N毀了,引用也銷毀了(原文件沒了,快捷方式也沒了)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容