後期靜態繫結在PHP中的使用

2021-10-20 15:39:36 字數 1783 閱讀 2177

什麼叫後期靜態繫結呢?其實我們在之前的文章php中的static中已經說過這個東西了。今天我們還是再次深入的理解一下這個概念。

首先,我們通過一段**來引入後期靜態繫結這一概念:

class

apublic

static function test()

}class

b extends a}b:

:test()

;// a

在這段**中,我們使用了self關鍵字,當使用b類呼叫test()靜態方法時,self指向的是a類的who()方法,因此,輸出的python基礎教程是a。別激動,這是普通的靜態繫結。self關鍵字呼叫的內容取決於它定義時所在的類。也就是說不管怎麼繼承,用哪個子類來呼叫test()方法,self關鍵字都會呼叫的是a類的who()方法。

而後期靜態繫結呢?其實就有點像例項化的類物件,每個例項化的物件,呼叫的都是自身,而不是父類的屬性方法。普通的靜態呼叫可不是這樣,但是現實中我們又有這樣的需求,就像例項化物件的呼叫方式一樣來呼叫靜態屬性方法,這時,我們就可以使用static關鍵字來實現後期靜態繫結。

class

cpublic

static function test()

}class

d extends c}d:

:test()

;// d

當使用static關鍵字後,這裡d類呼叫的test()方法內部呼叫的who()就是d類自己了。

官方文件中的定義如下:

當進行靜態方法呼叫時,該類名即為明確指定的那個(通常在 :: 運算子左側部分);當進行非靜態方法呼叫時,即為該物件所屬的類。

該功能從語言內部角度考慮被命名為「後期靜態繫結」。「後期繫結」的意思是說,static:: 不再被解析為定義當前方法所在的類,而是在實際執行時計算的。也可以稱之為「靜態繫結」,因為它可以用於(但不限於)靜態方法的呼叫。

除了self和static關鍵字外,我們還有乙個parent關鍵字,這個關鍵字的意義就很明顯了,呼叫父類的靜態內容。我們同時用三個關鍵字一起來進行測試:

class

epublic

static function test()

}class

f extends e

}class

g extends f}g:

:test()

;// e

// f

// g

最後,我們再來看兩個php的方法,乙個是get_called_class()方法,用來獲取當前呼叫的是哪個類。在靜態方法中可以根據調c#教程用方式判斷當前類是哪個類來進行其他的業務邏輯操作。另乙個是forward_static_call()方法,用於靜態方法的呼叫。

class

hpublic

static function test()

}class

i extends h

}function who()

h::test()

;// h

// ***:a,b

// i:c,d

// h:e,fi::

test()

;// i

// ***:a,b

// i:c,d

// h:e,f

注意,如果forward_static_call()不指定類名的話,將呼叫全域性的方法。forward_static_call_array()則是將引數使用陣列進行傳遞。

測試**:

參考文件:

php後期靜態繫結

後期靜態繫結 static 不再被解析為定義當前方法或屬性所在的類,而是在實際執行時計算的 可用 get called class 函式來得到被呼叫的方法所在的類名 this是指向當前物件 self 指向當前的類 self就是寫在哪個類裡面,實際呼叫的就是這個類 parent 指向父類 static...

php中後期靜態繫結(延遲靜態繫結)技術

定義乙個父類 這就要用到後期靜態繫結的技術,所謂後期,是指靜態方法的呼叫者,只有在執行狀態下才進行動態繫結,使用關鍵字 static 來實現,此時,static 就像乙個變數,始終與當前的呼叫類是繫結的class father 靜態方法 訪問當前類中的其它靜態成員 public static fun...

PHP高階特性 後期靜態繫結

後期繫結 的意思是說,static 不再被解析為定義當前方法所在的類,而是由最終運算時動態決定。也可以稱之為 靜態繫結 因為它可以用於 但不限於 靜態方法的呼叫。class a publicstaticfunction test class b extends a b test 輸出 class a...