php自定義函數(shù)之變量作用域
我們通過前面的章節(jié)函數(shù)定義部份的學(xué)習(xí)我們知道了幾個不同的規(guī)矩:
函數(shù)定義時后括號里面接的變量是形式上的參數(shù)(形參),與函數(shù)體外的變量沒有任何關(guān)系。僅僅是在函數(shù)內(nèi)部執(zhí)行
函數(shù)內(nèi)聲明的變量也與函數(shù)外的變量沒關(guān)系。
但是,我們實際的處理情況中會遇到這樣的一個情況:
我想在函數(shù)體內(nèi)定義的變量在函數(shù)體外用
我想把函數(shù)體外的變量拿到函數(shù)體內(nèi)來使用
這個時候我們就需要用到超全局變量。我們來回顧一下之前的知識點:
全局變量名 | 功能說明 |
---|---|
$_COOKIE | 得到會話控制中cookie傳值 |
$_SESSION | 得到會話控制中session的值 |
$_FILES | 得到文件上傳的結(jié)果 |
$_GET | 得到get傳值的結(jié)果 |
$_POST | 得到post傳值的結(jié)果 |
$_REQUEST | 即能得到get的傳值結(jié)果,也能得到Post傳值的結(jié)果 |
我們來通過實驗來觀察 一下外部變量(超全局變量)的特點,打破本章開頭我們總結(jié)的規(guī)律:
我們定義一下global.html頁現(xiàn)來寫HTML內(nèi)容:
<html> <head> <title>超全局?jǐn)?shù)組實驗</title> </head> <body> <!--先用POST來實驗,以后你可以改成GET喲 --> <form action="glob.php" method="post"> <input type="text" name="hongniu" /><br /> <input type="submit" value="提交" /> </form> </body> </html>
我們將html的內(nèi)容通過form表單提交給了glob.php頁面,我們現(xiàn)在來寫glob.php:
<?php function demo(){ echo $_POST['hongniu']; } demo(); ?>
通過這個小例子,你會發(fā)現(xiàn)超全局的$_POST等這一系列的超全局變量(外部變量)在函數(shù)內(nèi)部也是可以用的。沒有本文開始處變量作用域的限制。其實我們所有聲明的變量都放到了$GLOBALS這個數(shù)組下面,舉個例子:
<?php $hello = 10; echo $GLOBALS['hello'].'<br />'; $GLOBALS['hello'] = '我愛你'; echo $hello; ?>
通過上例,你會發(fā)現(xiàn)$變量名是等價于$GLOBALS['變量名'] 。所有的變量都放到了$GLOBALS里面了。而$GLOBALS也是全局的。
因此,我們能夠來達(dá)到我們的目的:將函數(shù)體內(nèi)的變量(局部變量)在函數(shù)外部使用。也可以讓函數(shù)外的變量到函數(shù)里面來使用。
1.通過$GLOBLAS來讀取外部變量
<?php $one = 10; function demo(){ $two = 100; $result = $two + $GLOBALS['one']; return $result; } //你會發(fā)現(xiàn)結(jié)果變成了110 echo demo(); ?>
上例中:我們將函數(shù)體外的變量通過$GLOBALS拿到了函數(shù)體使用。所以,打破了函數(shù)外的變量不能在函數(shù)體內(nèi)使用的限定。
2.通過$GLOBLAS,在函數(shù)內(nèi)修改外部變量
<?php $hongniu = '我是一個兵,來自老百姓'; function test(){ echo '執(zhí)行了函數(shù)test喲<br />'; //調(diào)用test()函數(shù),將通過$GLOBALS['hongniu'],把$hongniu的值改變掉 $GLOBALS['hongniu'] = '幫助別人很快樂'; } test(); //發(fā)現(xiàn)是不是輸出的值變了呀? echo $hongniu; ?>
通過上例:我們發(fā)現(xiàn)通過$GLOBALS['hongniu'],把$hongniu的值改變掉,所以在最后輸出$hongniu的時候,值發(fā)生了變化。
3.通過$GLOBLAS,在函數(shù)內(nèi)創(chuàng)建全局變量
<?php function hello(){ $GLOBALS['que'] = '提神喝茶更好喲'; echo '你調(diào)了一下函數(shù)hello<br />'; } hello(); echo $que; ?>
上例中,我們發(fā)現(xiàn)$que是不存在的,可以調(diào)用函數(shù)hello()后,在函數(shù)外部可以執(zhí)行echo $que了,能夠看到結(jié)果:提神喝茶更好。我們明白了,函數(shù)內(nèi)聲明的變量,通過$GLOBALS聲明一個變量,也能夠顯示出來。
下面的知識是【了解】級別,我們越來越少的使用這種方式來聲明全局變量了。在函數(shù)內(nèi)使用global關(guān)鍵詞后面跟一個或多個變量,就把變量變?yōu)榱巳肿兞?,格式如下?/p>
global $變量1[,變量2,....變量n]
在global后面可以跟一個或者多個變量,變量用逗號分開。
<?php $a = 10; $b = 100; function test(){ global $a , $b; echo $a + $b; } //結(jié)果是不是顯示出來了? test(); ?>
上例中,你還可以試試在global關(guān)鍵詞后面跟著未創(chuàng)建的變量,在函數(shù)體內(nèi)定義變量值,修改變量的值試試。其實與$GLOBALS一樣,只是用法不同而已。
注意:
不可在global 后寫 $變量 = 值。
global
讀音:[?gl??bl]
解釋:全局的,全球的