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毀了,引用也銷毀了(原文件沒了,快捷方式也沒了)