4.3.7 變量的作用域
PHP中的變量按其作用域的不同可以分爲若幹種(zhǒng)類,如局部變量、全局變量、靜态變量、動态變量、引用變量、預定義變量、外部變量等,其中引用變量已經(jīng)講過(guò)了,預定義變量和外部變量將(jiāng)在第5章講解,下面(miàn)對(duì)前4種(zhǒng)變量的進(jìn)行詳細講解。
4.3.7.1 局部變量與全局變量
PHP中的變量是有作用範圍的,一般情況下,變量的作用域是包含變量的PHP程序塊,也就是“<?php”和“?>”之間的代碼或者“{”、“}”之間的代碼。如果其中還(hái)有include()或require()函數包含的文件,變量的作用域也可以擴展到這(zhè)些文件裡(lǐ)。
在主程序中定義的變量隻在主程序中有效,在函數中定義的變量隻在函數中有效,在函數之外就無效了。
如果要在函數中引用主程序中的變量的值,要使用PHP定義的$GLOBALS數組。$GLOBALS數組是一個以變量名爲下标的數組,可以直接調用。
還(hái)有一種(zhǒng)實現跨域調用功能(néng)的方法就是使用全局變量,值得注意的是,PHP中的全局變量并不是對(duì)整個程序都(dōu)可見,在主程序中可以訪問函數中的全局變量,但是在函數中并不能(néng)訪問主程序的全局變量。其定義的語法爲:
global $變量名;
隻要將(jiāng)變量定義爲全局變量,以後(hòu)訪問這(zhè)個變量時就不需要使用$GLOBALS數組了。程序4-25.php爲就全局變量和局部變量使用示例。
<!--文件4-25.php:局部變量和全局變量--> <HTML> <HEAD> <TITLE>局部變量和全局變量</TITLE> </HEAD> <BODY> <?php $var1=6; //定義一個局部變量 echo "定義局部變量$var=".$var1; include("a.php"); function myfun1(){ echo "<br>在myfun1()函數中輸出局部變量"; echo "$var1=".@$var1; } myfun1(); function myfun2(){ echo "<br>在myfun2()函數中輸出局部變量"; echo "$var1=".$GLOBALS["var1"]; } myfun2(); global $var2; $var2=8; function myfun3(){ global $var3; $var3=9; echo "<br>在myfun3()函數中輸出全局變量"; echo "$var2=".@$var2."<br>"; echo "$var3=".$var3; } myfun3(); echo "<br>在函數外輸出全局變量"; echo "$var2=".$var2; echo " $var3=".$var3; ?> </BODY> </HTML>
被包含的a.php代碼如下:
<!--文件a.php:文件4-25.php所包含的文件--> <?php echo "<br>在a.php中輸出$var的值"; echo "$var1=".$var1; echo "<br>在a.php中的函數中輸出$var的值"; function myfun4(){ echo "$var1=".@$var1; } myfun4(); ?>
程序4-25.php的運行結果如圖4-22所示。
圖4-22 程序4-25.php的運行結果
4.3.7.2 靜态變量和動态變量
靜态變量隻能(néng)用于函數範圍内,它與普通局部變量不同之處在于:當該函數運行結束時,靜态變量不會丢失自己的值。靜态變量的定義方法爲在變量名前加“static”關鍵字。
PHP中的動态變量允許一個變量的值作爲另一個變量的變量名,前提條件是這(zhè)個值要符合變量的命名規則。其實就是前面(miàn)學(xué)習過(guò)的“變量的變量”,之所以在此處再拿出來講解,是爲了與靜态變量相對(duì)應。
程序4-26.php爲靜态變量和動态變量示例。
<!--文件4-26.php:靜态變量與動态變量--> <HTML> <HEAD> <TITLE>靜态變量與動态變量</TITLE> </HEAD> <BODY> <?php function fun1() { $int1=0; //定義普通變量 echo $int1." "; $int1 ; } fun1(); //輸出0 fun1(); //輸出還(hái)是0 echo "<br>*************<br>"; function fun2() { static $int2=0; //定義靜态變量 echo $int2." "; $int2 ; } fun2(); //輸出0 fun2(); //輸出1 echo "<br>*************<br>"; $int=6; $var="int"; echo $$var; //輸出動态變量 $$var=8; echo " ".$int; ?> </BODY> </HTML>
程序4-26.php的運行結果如圖4-23所示。
圖4-23 程序4-26.php的運行結果
過(guò)程序4-26.php不難看出靜态變量與普通變量的區别,在函數fun2()中靜态變量$int2隻被初始化了一次,在該函數退出時$int2的值不會丢失,所以反複調用函數fun2()時,$int2的值會累加。
局部和全局作用域(loacal global) 在所有函數外定義的變量擁有全局作用域,在函數内部聲明的變量是局部變量,僅能(néng)在函數内部訪問。要在一個函數中使用全局變量,需要使用global關鍵字。
在用戶自定義函數中,一個局部函數範圍將(jiāng)被引入。任何用于函數内部的變量按缺省情況將(jiāng)被限制在局部函數範圍内。
<!--文件4-26.php:靜态變量與動态變量--> 2: <HTML> 3: <HEAD> 4: <TITLE>靜态變量與動态變量</TITLE> 5: </HEAD> 6: <BODY> 7: <?php 8: function fun1() 9: { 10: $int1=0; //定義普通變量 11: echo $int1." "; 12: $int1 ; 13: } 14: fun1(); //輸出0 15: fun1(); //輸出還(hái)是0 16: echo "<br>*************<br>"; 17: function fun2() 18: { 19: static $int2=0; //定義靜态變量 20: echo $int2." "; 21: $int2 ; 22: } 23: fun2(); //輸出0 24: fun2(); //輸出1 25: echo "<br>*************<br>"; 26: $int=6; 27: $var="int"; 28: echo $$var; //輸出動态變量 29: $$var=8; 30 echo " ".$int; 31: ?> 32: </BODY> 33:</HTML> 這(zhè)一部分的代碼測試了一下,很成(chéng)功
這(zhè)些語法基礎對(duì)于剛學(xué)習PHP的人來說是非常重要的,條理清晰,方便學(xué)習