一、簡(jiǎn)介
static關(guān)鍵字用來(lái)定義靜態(tài)方法和屬性重荠,也可以用來(lái)定義靜態(tài)變量以及后期靜態(tài)綁定。
聲明類(lèi)屬性或方法為靜態(tài)珠漂,就可以不實(shí)例化類(lèi)而直接訪(fǎng)問(wèn)晚缩。靜態(tài)屬性不能通過(guò)一個(gè)類(lèi)已實(shí)例化的對(duì)象來(lái)訪(fǎng)問(wèn)(但靜態(tài)方法可以)。
二媳危、靜態(tài)方法和屬性
案例說(shuō)明:
class Foo{
public static $my_static = 'foo'; //聲明靜態(tài)屬性
public function staticFunc(){
return self::$my_static;
}
static public function test(){
return $this->$my_static; //致使錯(cuò)誤荞彼,this 在靜態(tài)方法中不可用
}
}
class UseFoo{
static public function index(){
$eof = "<br/>";
echo Foo::$my_static,1,$eof; //靜態(tài)屬性的調(diào)用方式
$foo = new Foo();
echo $foo->staticFunc(),2,$eof;
echo $foo->my_static,3,$eof; //報(bào)錯(cuò),因?yàn)椴荒苁褂?>方式調(diào)用靜態(tài)屬性
echo $foo::$my_static,4,$eof;
}
}
UseFoo::index(); //直接調(diào)用靜態(tài)方法
注意:
1)由于靜態(tài)方法不需要通過(guò)對(duì)象即可調(diào)用待笑,所以偽變量$this 在靜態(tài)方法中不可用鸣皂。
2)靜態(tài)屬性不可以由對(duì)象通過(guò)->
操作符來(lái)訪(fǎng)問(wèn)。
3)靜態(tài)方法可以通過(guò)類(lèi)::方法名()
的形式調(diào)用暮蹂,也可以通過(guò)$this->方法名()
的形式寞缝。
三、使用靜態(tài)變量
變量范圍的另一個(gè)重要特性是靜態(tài)變量(static variable)仰泻。靜態(tài)變量?jī)H在局部函數(shù)域中存在荆陆,但當(dāng)程序執(zhí)行離開(kāi)此作用域時(shí),其值并不丟失集侯。
案例說(shuō)明:
function test($id)
{
static $count=0;
echo "{$id}=>count is :".$count."<br/>";
$count++;
}
test(1);
test(2);
test(3);
//結(jié)果如下:
1=>count is :0
2=>count is :1
3=>count is :2
注意:
1)靜態(tài)變量?jī)H初始化一次
2)每次執(zhí)行函數(shù)該值會(huì)保留
3)static修改的變量是局部的被啼,僅在函數(shù)內(nèi)部有效
4)可以用來(lái)記錄函數(shù)調(diào)用次數(shù),從而可以在某些條件下終止遞歸
四棠枉、后期靜態(tài)綁定
自 PHP 5.3.0 起浓体,PHP 增加了一個(gè)叫做后期靜態(tài)綁定的功能,用于在繼承范圍內(nèi)引用靜態(tài)調(diào)用的類(lèi)辈讶。
準(zhǔn)確說(shuō)命浴,后期靜態(tài)綁定工作原理是存儲(chǔ)了在上一個(gè)“非轉(zhuǎn)發(fā)調(diào)用”(non-forwarding call)的類(lèi)名。當(dāng)進(jìn)行靜態(tài)方法調(diào)用時(shí),該類(lèi)名即為明確指定的那個(gè)(通常在 :: 運(yùn)算符左側(cè)部分)生闲;當(dāng)進(jìn)行非靜態(tài)方法調(diào)用時(shí)媳溺,即為該對(duì)象所屬的類(lèi)。所謂的“轉(zhuǎn)發(fā)調(diào)用”(forwarding call)指的是通過(guò)以下幾種方式進(jìn)行的靜態(tài)調(diào)用:self::跪腹,parent::褂删,static:: 以及 forward_static_call()〕迦祝可用 get_called_class() 函數(shù)來(lái)得到被調(diào)用的方法所在的類(lèi)名屯阀,static:: 則指出了其范圍。
該功能從語(yǔ)言?xún)?nèi)部角度考慮被命名為“后期靜態(tài)綁定”轴术∧阉ィ“后期綁定”的意思是說(shuō),static:: 不再被解析為定義當(dāng)前方法所在的類(lèi)逗栽,而是在實(shí)際運(yùn)行時(shí)計(jì)算的盖袭。也可以稱(chēng)之為“靜態(tài)綁定”,因?yàn)樗梢杂糜冢ǖ幌抻冢╈o態(tài)方法的調(diào)用彼宠。
官方文檔: http://php.net/manual/zh/language.oop5.late-static-bindings.php
五鳄虱、經(jīng)典案例
1、寫(xiě)出如下程序的輸出結(jié)果
$count = 5;
function get_count(){
static $count;
return $count++;
}
echo $count,"\n\r";
++$count;
echo get_count(),"\n\r";
echo get_count(),"\n\r";
結(jié)果如下:
root@Chan:/var/www/html# php demo25.php
5
1
結(jié)果分析:
參考
官方手冊(cè):
http://www.php.net/manual/zh/language.oop5.static.php