在實例化時,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 對象。