php中self與static的區別

2021-08-07 02:38:53 字數 1623 閱讀 3801

通過一些示例,我們可以很容易看出self和static的區別。假定我們有class car – 它有兩個方法,model和getmodel。注意,這裡我們使用了關鍵字self。

class

car protected

static

function

getmodel

()

}

呼叫靜態方法

car::model();
得到輸出

i am a car!
關鍵字self使得我們呼叫了class car的getmodel方法,輸出了文字「i am a car!」。

下面我們新增乙個新的類,class mercedes, 它繼承自class car,**如下:

class

mercedes

extends

car}

當我們呼叫mercedes::model()時,猜猜結果是什麼?

可能你覺得結果會是:

i am a mercedes!
但實際輸出是:

i am a car!
這是為什麼呢?

關鍵字「self」的工作原理是:它會呼叫當前類(current class)的方法。因為model方法只在class car中定義的,所以對它來說當前類就是class car。model中的self::getmodel(),呼叫的自然也就是class car中的getmodel方法。

這個行為似乎不是我們想要的,它不符合物件導向的設計原則。如何解決呢?可以使用關鍵字static。

在php5.3中,加入了乙個新的特性,叫做延遲靜態繫結。它可以幫我們實現多型,解決上面的問題。簡單來說,延遲靜態繫結意味著,當我們用static關鍵字呼叫乙個繼承方法時,它將在執行時繫結呼叫類(calling class)。在上面的例子中,如果我們使用延遲靜態繫結(static),意味當我們呼叫「mercedes::model();」時,class mercedes中的getmodel方法將會被呼叫。因為mercedes是我們的呼叫類

class

car protected

static

function

getmodel

()

}

我們只是將class car中的self替換成了static,並未對class mercedes作修改。

現在我們呼叫

mercedes

::model();

得到輸出

i am a mercedes!
注意,php 5.3之前的版本無法使用延遲靜態繫結。如果嘗試在php 5.3以下的版本執行上面的例子,將會報錯。

現在我們將例子中的self用static替換,可以看到,兩者的區別在於:self引用的是當前類(current class)而static允許函式呼叫在執行時繫結呼叫類(calling class)。

php中static和self的區別

在閱讀一些框架的原始碼時發現了new static 和new self 甚是不解,後來查閱資料,才知道static採用了延遲繫結,能準確知道是父類還是子類的呼叫。這就是說static是個聰明的小孩,家裡的親戚的輩分他都能準確的叫出 而不是像他的兄弟self,只知道自己的親爹媽。例子如下 class ...

PHP 中 static 和 self 的區別

使用 self 或者 class 對當前類的靜態引用,取決於定義當前方法所在的類 使用static 不再被解析為定義當前方法所在的類,而是在實際執行時計算的。也可以稱之為 靜態繫結 因為它可以用於 但不限於 靜態方法的呼叫。靜態繫結是php 5.3.0,增加的乙個功能 用於在繼承範圍內引用靜態呼叫的...

php中static和self的區別

在閱讀一些框架的原始碼時發現了new static 和new self 甚是不解,後來查閱資料,才知道static採用了延遲繫結,能準確知道是父類還是子類的呼叫。這就是說static是個聰明的小孩,家裡的親戚的輩分他都能準確的叫出 而不是像他的兄弟self,只知道自己的親爹媽。例子如下 class ...