php自訂函數之變數作用域
我們透過前面的章節函數定義部份的學習我們知道了幾個不同的規矩:
函數定義時後括號裡面接的變數是形式上的參數(形參),與函數體外的變數沒有任何關係。只是在函數內部執行
函數內宣告的變數也與函數外的變數沒關係。
但是,我們實際的處理情況中會遇到這樣的一個情況:
我想在函數體內定義的變數在函數體外用
我想把函數體外的變數拿到函數體內來使用
這個時候我們就需要用到超全局變數。我們來回顧一下先前的知識點:
#全域變數名稱 | #功能說明 |
---|---|
#$_COOKIE | |
#$_SESSION | |
#$_FILES | |
#$_GET | |
$_POST |
我們來透過實驗來觀察外部變數(超全域變數)的特點,打破本章開頭我們總結的規律:
我們定義一下global.html頁現來寫HTML內容:
<html> <head> <title>超全局数组实验</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的內容透過form表單提交給了glob.php頁面,我們現在來寫glob.php:
<?php function demo(){ echo $_POST['hongniu']; } demo(); ?>
透過這個小例子,你會發現超全局的$ _POST等這一系列的超全域變數(外部變數)在函數內部也是可以用的。沒有本文開始處變數作用域的限制。 其實我們所有宣告的變數都放到了$GLOBALS這個陣列下面,舉個例子:
<?php $hello = 10; echo $GLOBALS['hello'].'<br />'; $GLOBALS['hello'] = '我爱你'; echo $hello; ?>
透過上例,你會發現$變數名稱是等價於$ GLOBALS['變數名'] 。所有的變數都放到了$GLOBALS裡面了。而$GLOBALS也是全域的。
因此,我們能夠來達到我們的目的:將函數體內的變數(局部變數)在函數外部使用。也可以讓函數外的變數到函數裡面來使用。
1.透過$GLOBLAS來讀取外部變數
<?php $one = 10; function demo(){ $two = 100; $result = $two + $GLOBALS['one']; return $result; } //你会发现结果变成了110 echo demo(); ?>
上例中:我們將函數體外的變數透過$GLOBALS拿到了函數體使用。所以,打破了函數外的變數不能在函數體內使用的限定。
2.透過$GLOBLAS,在函數內修改外部變數
<?php $hongniu = '我是一个兵,来自老百姓'; function test(){ echo '执行了函数test哟<br />'; //调用test()函数,将通过$GLOBALS['hongniu'],把$hongniu的值改变掉 $GLOBALS['hongniu'] = '帮助别人很快乐'; } test(); //发现是不是输出的值变了呀? echo $hongniu; ?>
透過上例:我們發現透過$GLOBALS['hongniu'],把$hongniu的值改變掉,所以在最後輸出$hongniu的時候,數值改變了。
3.透過$GLOBLAS,在函數內建立全域變數
<?php function hello(){ $GLOBALS['que'] = '提神喝茶更好哟'; echo '你调了一下函数hello<br />'; } hello(); echo $que; ?>
上例中,我們發現$que是不存在的,可以呼叫函數hello()後,在函數外部可以執行echo $que了,能夠看到結果:提神喝茶更好。我們明白了,函數內聲明的變量,透過$GLOBALS聲明一個變量,也能夠顯示出來。
下面的知識是【了解】級別,我們越來越少的使用這種方式來宣告全域變數了。在函數內使用global關鍵字後面跟著一個或多個變量,就把變數變成全域變量,格式如下:
global $變數1[,變數2,....變數n ]
在global後面可以跟一個或多個變量,變數用逗號分開。
<?php $a = 10; $b = 100; function test(){ global $a , $b; echo $a + $b; } //结果是不是显示出来了? test(); ?>
上例中,你也可以試試在global關鍵字後面跟著未建立的變量,在函數體內定義變數值,修改變數的值試試。其實跟$GLOBALS一樣,只是用法不同而已。
注意:
不可在global 後寫 $變數 = 值。
global
讀音:[ˈgləʊbl]
解釋:全局的,全球的