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

在實例化時,static 關鍵字相似於 self 關鍵字,但 static 關鍵字指的是被調用的類,而 self 關鍵字指的是包含類。php

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

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

代碼以下:對象

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

class Document extends DomainObject {
}

Document::create();

在示例代碼中,將經常使用方法 create() 放在父類中,並使用 self 關鍵字做爲對該類的引用,這裏實際上是對 self 關鍵字作的一個假設。實際上, self 關鍵字對該類所起的做用與 $this 對對象所起的做用並不徹底相同。 self 關鍵字指的不是調用上下文,它指的是解析上下文。所以,運行示例代碼可得:io


PHP Fatal error: Cannot instantiate abstract class DomainObject in ...function


由此可看出, self 關鍵字被解析爲定義 create() 的 DomainObject ,而不是解析爲調用 self 的 Document 類。class

將 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 對象。

相關文章
相關標籤/搜索