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东跪,但是確實完全不同的兩個變量畸陡,也是兩種不同的作用域鹰溜,打印出的很明顯是全局的變量。
global關(guān)鍵字
我們經(jīng)常會遇到一種情況丁恭,在函數(shù)外部聲明了一個全局變量后曹动,我們想在函數(shù)內(nèi)部訪問或者修改這一全局變量,這里我們就需要使用一個叫g(shù)lobal的關(guān)鍵字來實現(xiàn)牲览。
還用剛剛那段代碼墓陈,我們想在foo()
函數(shù)內(nèi)部修改$var的值,像上面那樣寫法肯定是不行第献,
function foo(){
$var = '2';//這里只是相當(dāng)于重新定義一個局部變量贡必,只不過名字恰好跟var是相同的
}
我們需要借助global關(guān)鍵字來實現(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
因為我們知道global是生成一個全局變量的別名引用(類似于桌面上一個文件跟它的快捷方式)。引用的值修改后肋联,全局變量的值也就修改了威蕉,在第一段代碼中,修改了快捷方式的內(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é)果都是空
因為全局變量銷毀了锁孟,引用也銷毀了(原文件沒了彬祖,快捷方式也沒了)