變數的有效範圍是指只有在該範圍之內電腦才知道有這樣一個變數存在並可存取其所儲的值。 大前題是所有的 PHP 變數都只有單一的有效範圍。 這有效範圍伸展到被 include() 和 require() 的文件中。 請看示範:
在 b.inc 文件中 $a 變數的值也是 1 。 然而, 在函數中的變數其有效範圍則局限在函數的本體之中。 跳進函數時電腦不會知道在函數被調用之前有什麼變數曾被定義, 而所有在函數執行時才定義的變數在跳出函數後都會消失。 如下例:
$a = 1; /* global scope */ Function Test () { echo $a; /* reference to local scope variable */ } Test (); |
該程式並不會打出任何值因為在 echo $a 這一指令中, $a 的有效範圍只是在函數之中,但在函數當中並沒有定義 $a 的值; 另一方面在函數外的 $a 的有效範圍並不會伸展到函數�去。 如你是 C 程式員的話請留意這種有效範圍的定法和 C 不一樣: 在 C 當中所有主程式中的變數都是全域變數。 (除非在函數中另外指定。) 因為 C 的方式會不小心在函數中改動了外部變數, 所以在 PHP 之中有如想存取外部變數的話就必須宣告一個全域變數。 示範如下:
上面的例子才會印出 "3"。 在函數中宣告 $a、$b 為全域變數之後就可以存取在函數外面的變數。 一個函數可以宣告任意多個全域變數。
另外一個存取外部變數的方法是調用 PHP 內置的 $GLOBALS[] 陣列。 現在把前面的例子改寫一下:
$GLOBALS 陣列是一個關聯字索引式陣列, 變數的名字會作為在存取該陣列的索引。
另一個重要的變數有效範圍的概念是被宣告成 static 類型(靜態)的變數。 靜態變數只在函數之中出現, 不過在跳出函數之後它們的值並不會消失。 考慮下面的情況:
上面的函數根本起不了作用因為每次進入函數後 $a 都會被重新指定為 "0"• $a++ 這一句指令一點用也沒有因為每次跳出函數時 $a 就消失了。 為了令函數成為有用的計數器, 必須把 $a 宣告為 static:
現在 test() 函數會印出 $a 的值並把值它加 1。
靜態變數也可以用來編寫遞歸函數 recursive function。 這類函數會調用自己。 寫這類函數時要避免無限循環地調用。 你一定要有辦法把遞歸終止。 下例用 $count 變數來計數, 當它數到 10 的時候就跳出函數: