一、簡介
static關(guān)鍵字用來定義靜態(tài)方法和屬性,也可以用來定義靜態(tài)變量以及后期靜態(tài)綁定。
聲明類屬性或方法為靜態(tài),就可以不實(shí)例化類而直接訪問。靜態(tài)屬性不能通過一個(gè)類已實(shí)例化的對象來訪問(但靜態(tài)方法可以)。
二、靜態(tài)方法和屬性
案例說明:
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)方法不需要通過對象即可調(diào)用,所以偽變量$this 在靜態(tài)方法中不可用。
2)靜態(tài)屬性不可以由對象通過->操作符來訪問。
3)靜態(tài)方法可以通過類::方法名()的形式調(diào)用,也可以通過$this->方法名()的形式。
三、使用靜態(tài)變量
變量范圍的另一個(gè)重要特性是靜態(tài)變量(static variable)。靜態(tài)變量僅在局部函數(shù)域中存在,但當(dāng)程序執(zhí)行離開此作用域時(shí),其值并不丟失。
案例說明:
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)變量僅初始化一次
2)每次執(zhí)行函數(shù)該值會保留
3)static修改的變量是局部的,僅在函數(shù)內(nèi)部有效
4)可以用來記錄函數(shù)調(diào)用次數(shù),從而可以在某些條件下終止遞歸
四、后期靜態(tài)綁定
自 PHP 5.3.0 起,PHP 增加了一個(gè)叫做后期靜態(tài)綁定的功能,用于在繼承范圍內(nèi)引用靜態(tài)調(diào)用的類。
準(zhǔn)確說,后期靜態(tài)綁定工作原理是存儲了在上一個(gè)“非轉(zhuǎn)發(fā)調(diào)用”(non-forwarding call)的類名。當(dāng)進(jìn)行靜態(tài)方法調(diào)用時(shí),該類名即為明確指定的那個(gè)(通常在 :: 運(yùn)算符左側(cè)部分);當(dāng)進(jìn)行非靜態(tài)方法調(diào)用時(shí),即為該對象所屬的類。所謂的“轉(zhuǎn)發(fā)調(diào)用”(forwarding call)指的是通過以下幾種方式進(jìn)行的靜態(tài)調(diào)用:self::,parent::,static:: 以及 forward_static_call()??捎?get_called_class() 函數(shù)來得到被調(diào)用的方法所在的類名,static:: 則指出了其范圍。
該功能從語言內(nèi)部角度考慮被命名為“后期靜態(tài)綁定”。“后期綁定”的意思是說,static:: 不再被解析為定義當(dāng)前方法所在的類,而是在實(shí)際運(yùn)行時(shí)計(jì)算的。也可以稱之為“靜態(tài)綁定”,因?yàn)樗梢杂糜冢ǖ幌抻冢╈o態(tài)方法的調(diào)用。
官方文檔: http://php.net/manual/zh/language.oop5.late-static-bindings.php
五、經(jīng)典案例
1、寫出如下程序的輸出結(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é)果分析:
