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