php中static關鍵字

PHP中的static關鍵字,在類中的用法

很容易相當可以聲明類屬性或者類方法爲靜態,靜態屬性和方法嗾使屬於類的,靜態屬性不能通過對象訪問,但靜態方法可以通過對象訪問。

PHP中函數體中的用法

php中static變量只存在於本地函數中,但程序執行完本函數之後,static變量還會一直保存,也即是 數執行$a 該變量只會被實例化一次。

function test()
{
    $a = 0;
    echo $a . "\n";
    $a++;
}

// 都會輸出0
for ($i=0; $i<5; $i++) {
    test();
}
//result :0 0 0 0 0 
function test()
{
    static $a = 0;
    echo $a . "\n";
    $a++;
}

// 都會輸出0
for ($i=0; $i<5; $i++) {
    test();
}
//result :0 1 2 3 4

將變量a聲明爲static後,每次函數執行$a 只會被實例化一次。

因此 :在遞歸函數中,用static可以作爲函數運行計數器來使用。

延遲靜態綁定

class A{
    static $name = "Tom";
    public function printName(){
        echo self::$name."\n";
        self::fun();
    }
    static function fun(){
        echo "A Class\n";
    }
}
class B extends A{
    static $name = "Jon";
    static function fun(){
        echo "B Class\n";
    }
}
$obj = new B();
$obj->printName();
// 輸出結果
// Tom
// A Class

在printName函數裏面使用了self關鍵字,self是指向當前類的"指針",
是這樣的,在定義A類的是時候,在函數printName裏面使用self關鍵字調用了靜態方法或屬性,
但是這個函數一旦定義好,A類的靜態方法和屬性就被綁定到函數了,不要去追究爲什麼,php就是這麼實現的,
但是我們現在要實現這樣的效果,就是函數定義好后里面使用到的靜態方法和屬性不要立即綁定死,
而是根據最終繼承的類來確定綁定。
所以php在5.5以後使用了static關鍵字來解決這個問題,解決後的代碼例子如下:

class A{
    static $name = "Tom";
    public function printName(){
        echo static::$name."\n";
        static::fun();
    }
    static function fun(){
        echo "A Class\n";
    }
}
class B extends A{
    static $name = "Jon";
    static function fun(){
        echo "B Class\n";
    }
}
$obj = new B();
$obj->printName();
// 輸出結果
// Join
// B Class

延遲了綁定的類,就實現了需要延遲靜態綁定。

參考:
https://www.jianshu.com/p/ab5749914f7c
https://www.cnblogs.com/codeAB/p/5560631.html

發佈了9 篇原創文章 · 獲贊 1 · 訪問量 8017
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章