什麼叫後期靜態繫結呢?其實我們在之前的文章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...