變量范圍的另一個(gè)重要特性是靜態(tài)變量(staticvariable)。靜態(tài)變量僅在局部函數(shù)域中存在,但當(dāng)程序執(zhí)行離開此作用域時(shí),其值并不丟失。
看看下面的例子:
例子 演示需要靜態(tài)變量的例子
function test(){ $a = 0; echo $a ; $a ++; } |
本函數(shù)沒什么用處,因?yàn)槊看握{(diào)用時(shí)都會將 $a 的值設(shè)為 0 并輸出 "0"。將變量加一的 $a++沒有作用,因?yàn)橐坏┩顺霰竞瘮?shù)則變量 $a 就不存在了。要寫一個(gè)不會丟失本次計(jì)數(shù)值的計(jì)數(shù)函數(shù),要將變量 $a 定義為靜態(tài)的:
例子 使用靜態(tài)變量的例子
function Test(){ static $a = 0; echo $a ; $a ++; } Test(); //調(diào)用 0 Test(); //調(diào)用 1 |
靜態(tài)變量也提供了一種處理遞歸函數(shù)的方法。遞歸函數(shù)是一種調(diào)用自己的函數(shù)。寫遞歸函數(shù)時(shí)要小心,因?yàn)榭赡軙o窮遞歸下去。必須確保有充分的方法來中止遞歸。一下這個(gè)簡單的函數(shù)遞歸計(jì)數(shù)到10,使用靜態(tài)變量 $count 來判斷何時(shí)停止:
例子 靜態(tài)變量與遞歸函
function Test(){ static $count = 0; $count ++; echo $count ; if ( $count < 10) { Test(); } $count --; } |
例子 聲明靜態(tài)變量
function foo(){ static $int = 0; // correct static $int = 1+2; // wrong (as it is an expression_r) static $int = sqrt(121); // wrong (as it is an expression_r too) $int ++; echo $int ; } |
Class Person{ // 定義靜態(tài)成員屬性 public static $country = "中國" ; // 定義靜態(tài)成員方法 public static function myCountry() { // 內(nèi)部訪問靜態(tài)成員屬性 echo "我是" .self:: $country ."人 "; } } class Student extends Person { function study() { echo "我是" . parent:: $country ."人 "; } } // 輸出成員屬性值 echo Person:: $country ." "; // 輸出:中國 $p1 = new Person(); //echo $p1 ->country; // 錯誤寫法 // 訪問靜態(tài)成員方法 Person::myCountry(); // 輸出:我是中國人 // 靜態(tài)方法也可通過對象訪問: $p1 ->myCountry(); // 子類中輸出成員屬性值 echo Student:: $country ." "; // 輸出:中國 外部訪問靜態(tài)成員屬性和方法 $t1 = new Student(); //生成對象 $t1 ->study(); // 輸出:我是中國人 |
小結(jié)
在類內(nèi)部訪問靜態(tài)成員屬性或者方法,使用 self::(注意不是$slef),如:
slef:: $country
slef:: myCountry()
在子類訪問父類靜態(tài)成員屬性或方法,使用 parent::(注意不是$parent),如:
parent:: $country
parent:: myCountry()
外部訪問靜態(tài)成員屬性和方法為 類名/子類名:: ,如:
Person::$country
Person::myCountry()
Student::$country
但靜態(tài)方法也可以通過普通對象的方式訪問。