PHP中的self關鍵字詳解

2021-10-01 03:30:59 字數 2781 閱讀 6306

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.和 的區別 是對屬性的直接引用,不通...