延遲靜態繫結——static

悲劇不上演發表於2018-07-13

起因

乍聽之下這名詞很新鮮,各位聽眾繼續往下走就知道其實你們是見過的。最近在看《PHP物件導向實踐與設計》中講到了延遲靜態繫結static 的用法,特此來和大家分享,應該是比較簡單的內容吧。

直接上程式碼

/**
 * 功能:子類(學生類,老師類)例項化自己的類
 *
 */
abstract class People
{

}

class Student extends People {

    public static function create()
    {
        return new self();
    }
}

class Teacher extends People {

    public static function create()
    {
        return new self();
    }
}

var_dump(Student::create());

一般情況下,我們們首先想到的是上面的寫法,可以我們程式設計師是“懶惰”的,不可以可以在父類的只寫一個create()方法呢,那麼大家會首先想到的self()關鍵字吧(嘿嘿,至少我當時是這麼想的),那我們是實現一下看看:

 /**
 * 功能:子類例項化自己的類
 *
 */
abstract class People
{
    public static function create()
    {
        return new self();
    }
}

class Student extends People {

}

class Teacher extends People {

}

var_dump(Student::create());

結果:Fatal error: Uncaught Error: Cannot instantiate abstract class People

這個時候就是我們的主角static登場的時候,修改程式碼如下:

/**
 * 功能:子類例項化自己的類
 *
 */
abstract class People
{
    public static function create()
    {
        return new static();
    }
}

class Student extends People {

}

class Teacher extends People {

}

var_dump(Student::create());

結果: 很完美的輸出了Student類。

結論

哦,原來如此,是因為self關鍵字指向是當前類(即所在的類)的指標,它所在的People是抽象類,不能例項化的,他並沒有想我們們所想的那樣,指向呼叫者本身(即Student類)。而static 關鍵字,延遲靜態繫結,它所指向的即使呼叫者本身 (即Student類)。

相關文章