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