在例項化時,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 物件。