php群裡有人詢問self關鍵字的用法,答案是比較明顯的:靜態成員函式內不能用this呼叫非成員函式,但可以用self呼叫靜態成員函式/變數/常量;其他成員函式可以用self呼叫靜態成員函式以及非靜態成員函式。隨著討論的深入,發現self並沒有那麼簡單。鑑於此,本文先對幾個關鍵字做對比和區分,再總結self的用法。
要想將徹底搞懂self,要與parent、static以及this區分開。以下分別做對比。
parent
self與parent的區分比較容易:parent引用父類/基類被隱蓋的方法(或變數),self則引用自身方法(或變數)。例如建構函式中呼叫父類建構函式:
class
base
}class
child
}new
child
;// 輸出:
// base contructor!
// child contructor!
static
static常規用途是修飾函式或變數使其成為類函式和類變數,也可以修飾函式內變數延長其生命週期至整個應用程式的生命週期。但是其與self關聯上是php 5.3以來引入的新用途:靜態延遲繫結。
有了static的靜態延遲繫結功能,可以在執行時動態確定歸屬的類。例如:
class
base
public
static
function
getself()
public
static
function
getinstance()
public
function
selffoo()
public
function
staticfoo()
public
function
thisfoo()
public
function
foo()}
class
child
extends
base
public
function
foo()}
$base
= child:
:getself()
;$child
= child:
:getinstance()
;$child
->
selffoo()
;$child
->
staticfoo()
;$child
->
thisfoo()
;
程式輸出結果如下:
base constructor!
child constructor!
base foo!
child foo!
child foo!
在函式引用上,self與static的區別是:對於靜態成員函式,self指向**當前類,static指向呼叫類;對於非靜態成員函式,self抑制多型,指向當前類的成員函式,static等同於this,動態指向呼叫類的函式。
parent、self、static三個關鍵字聯合在一起看挺有意思,分別指向父類、當前類、子類,有點「過去、現在、未來」的味道。
this
self與this是被討論最多,也是最容易引起誤用的組合。兩者的主要區別如下:
this不能用在靜態成員函式中,self可以;
對靜態成員函式/變數的訪問,建議 用self,不要用thi
s::或
this::或
this::
或this->的形式;
對非靜態成員變數的訪問,不能用self,只能用this;
this要在物件已經例項化的情況下使用,self沒有此限制;
在非靜態成員函式內使用,self抑制多型行為,引用當前類的函式;而this引用呼叫類的重寫(override)函式(如果有的話)。
self的用途
看完與上述三個關鍵字的區別,self的用途是不是呼之即出?一句話總結,那就是:self總是指向「當前類(及類例項)」。詳細說則是:
替代類名,引用當前類的靜態成員變數和靜態函式;
抑制多型行為,引用當前類的函式而非子類中覆蓋的實現;
槽點這幾個關鍵字中,只有this要加符號且
必須加,
強迫症表
示很難受
;靜態成
員函式中
不能通過
符號且必須加,強迫症表示很難受; 靜態成員函式中不能通過
符號且必須加
,強迫症
表示很難
受;靜態
成員函式
中不能通
過this->呼叫非靜態成員函式,但是可以通過self::呼叫,且在呼叫函式中未使用$this->的情況下還能順暢執行。此行為貌似在不同php版本中表現不同,在當前的7.3中ok;
在靜態函式和非靜態函式中輸出self,猜猜結果是什麼?都是string(4) 「self」,迷之輸出;
return $this instanceof static::class;會有語法錯誤,但是以下兩種寫法就正常:
$class
=static::
class
;return
$this
instanceof
$class
;// 或者這樣:
return
$this
instanceof
static
iOS中self關鍵字
self關鍵字 1,例項方法裡面的self,是物件的首位址。2,類方法裡面的self,是class.儘管在同乙個類裡面的使用self,但是self卻有著不同的解讀。在類方法裡面的self,可以翻譯成class self 在例項方法裡面的self,應該被翻譯成為object self。在類方法裡面的s...
PHP中關鍵字static與self的使用區別
php中靜態關鍵字有static和self,那麼兩者的區別是什麼呢?首先來看一下self的情況 class a public static function test class b extends a a test a b test a再來看一下static的情況 class a public s...
力學 self關鍵字
self總是指向呼叫該方法的物件。self總是代表當前類的物件,當self出現在某個方法體中時,它代表的物件是不確定的,但是型別是確定的,它所代表的物件就是當前類的例項 當這個方法被呼叫時,它所代表的物件就確定下來了 誰在呼叫這個方法,self就代表誰。self.和 的區別 是對屬性的直接引用,不通...