PHP static 關鍵字和 self 關鍵字例項化的區別

易羽fxst發表於2019-02-16

在例項化時,static 關鍵字類似於 self 關鍵字,但 static 關鍵字指的是被呼叫的類,而 self 關鍵字指的是包含類。

這樣說可能不太好理解,接下來舉一個例子。

首先建立一個超類 DomainObject ,該類包含功能可被其擴充套件類共用,其次建立一個子類 Document 。

程式碼如下:

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

class Document extends DomainObject {
}

Document::create();

在示例程式碼中,將常用方法 create() 放在父類中,並使用 self 關鍵字作為對該類的引用,這裡其實是對 self 關鍵字做的一個假設。實際上, self 關鍵字對該類所起的作用與 $this 對物件所起的作用並不完全相同。 self 關鍵字指的不是呼叫上下文,它指的是解析上下文。因此,執行示例程式碼可得:


PHP Fatal error: Cannot instantiate abstract class DomainObject in …


由此可看出, self 關鍵字被解析為定義 create() 的 DomainObject ,而不是解析為呼叫 self 的 Document 類。

將 self 關鍵字替換為 static 關鍵字可得:

abstract class DomainObject {
    public static function create() {
        return new static();
    }
}

class Document extends DomainObject {
}

Document::create();

執行可得:


Document Object
{
}


這樣可得到上述結論,static 關鍵字類似於 self 關鍵字,但它指的是被呼叫的類而不是包含類。在本例中,意思是呼叫Document::create()將生成一個新的 Document 物件,而不是試圖例項化一個 DomainObject 物件。

相關文章