PHP強(qiáng)化之19 - 靜態(tài) Static

一、簡介

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é)果分析:

參考

官方手冊:
http://www.php.net/manual/zh/language.oop5.static.php

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 首先,這個(gè) static 符號跟 static(靜態(tài))關(guān)鍵字不是一個(gè)東西。這三個(gè)符號在PHP對象中共有兩種用...
    七夜5757閱讀 1,206評論 0 2
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,681評論 1 32
  • 事物在一天天變化著,同樣人也在不斷的變動著,舊的走了,新的又來,周而復(fù)始,沒有永遠(yuǎn)的相聚,也沒有永遠(yuǎn)的別離,反...
    半抹晴語詩閱讀 251評論 0 0
  • 一天又一天 青春來了 在匆忙著的光陰罅隙里 為偶然間的閑逸感到幸福 在白駒蒼狗的掠影里 為疲憊時(shí)流轉(zhuǎn)秋水的氤氳感動...
    12ena1ssnace閱讀 202評論 0 0
  • 實(shí)干是個(gè)名詞,是指去掉水分的實(shí)有干物質(zhì);實(shí)干又是形容詞,用來形容真實(shí)干出來的東西;實(shí)干還是副詞,表明實(shí)干的程度;實(shí)...
    南山li閱讀 586評論 0 0

友情鏈接更多精彩內(nèi)容