本篇文章給大家介紹一下在PHP中使用后期靜態(tài)綁定的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。
后期靜態(tài)綁定在PHP中的使用
什么叫后期靜態(tài)綁定呢?其實我們在之前的文章PHP中的static中已經(jīng)說過這個東西了。今天我們還是再次深入的理解一下這個概念。
首先,我們通過一段代碼來引入后期靜態(tài)綁定這一概念:
class A { public static function who() { echo __CLASS__, PHP_EOL; } public static function test() { self::who(); } } class B extends A { public static function who() { echo __CLASS__, PHP_EOL; } } B::test(); // A
在這段代碼中,我們使用了self關鍵字,當使用B類調用test()靜態(tài)方法時,self指向的是A類的who()方法,因此,輸出的是A。別激動,這是普通的靜態(tài)綁定。self關鍵字調用的內容取決于它定義時所在的類。也就是說不管怎么繼承,用哪個子類來調用test()方法,self關鍵字都會調用的是A類的who()方法。
而后期靜態(tài)綁定呢?其實就有點像實例化的類對象,每個實例化的對象,調用的都是自身,而不是父類的屬性方法。普通的靜態(tài)調用可不是這樣,但是現(xiàn)實中我們又有這樣的需求,就像實例化對象的調用方式一樣來調用靜態(tài)屬性方法,這時,我們就可以使用static關鍵字來實現(xiàn)后期靜態(tài)綁定。
class C { public static function who() { echo __CLASS__, PHP_EOL; } public static function test() { static::who(); } } class D extends C { public static function who() { echo __CLASS__, PHP_EOL; } } D::test(); // D
當使用static關鍵字后,這里D類調用的test()方法內部調用的who()就是D類自己了。
官方文檔中的定義如下:
當進行靜態(tài)方法調用時,該類名即為明確指定的那個(通常在 :: 運算符左側部分);當進行非靜態(tài)方法調用時,即為該對象所屬的類。
該功能從語言內部角度考慮被命名為“后期靜態(tài)綁定”?!昂笃诮壎ā钡囊馑际钦f,static:: 不再被解析為定義當前方法所在的類,而是在實際運行時計算的。也可以稱之為“靜態(tài)綁定”,因為它可以用于(但不限于)靜態(tài)方法的調用。
除了self和static關鍵字外,我們還有一個parent關鍵字,這個關鍵字的意義就很明顯了,調用父類的靜態(tài)內容。我們同時用三個關鍵字一起來進行測試:
class E { public static function who() { echo __CLASS__, PHP_EOL; } public static function test() { self::who(); static::who(); } } class F extends E { public static function who() { echo __CLASS__, PHP_EOL; } } class G extends F { public static function who() { parent::who(); echo __CLASS__, PHP_EOL; } } G::test(); // E // F // G
最后,我們再來看兩個PHP的方法,一個是get_called_class()方法,用來獲取當前調用的是哪個類。在靜態(tài)方法中可以根據(jù)調用方式判斷當前類是哪個類來進行其他的業(yè)務邏輯操作。另一個是forward_static_call()方法,用于靜態(tài)方法的調用。
class H { public static function who() { echo __CLASS__ . ':' . join(',', func_get_args()), PHP_EOL; } public static function test() { echo get_called_class(), PHP_EOL; forward_static_call('who', 'a', 'b'); // xxx:a,b forward_static_call(['I', 'who'], 'c', 'd'); // I:c,d forward_static_call_array(['H', 'who'], ['e', 'f']); // H:e,f } } class I extends H { public static function who() { echo __CLASS__ . ':' . join(',', func_get_args()), PHP_EOL; } } function who() { echo 'xxx:' . join(',', func_get_args()), PHP_EOL; } H::test(); // H // xxx:a,b // I:c,d // H:e,f I::test(); // I // xxx:a,b // I:c,d // H:e,f
注意,如果forward_static_call()不指定類名的話,將調用全局的方法。forward_static_call_array()則是將參數(shù)使用數(shù)組進行傳遞。
測試代碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202001/source/%E5%90%8E%E6%9C%9F%E9%9D%99%E6%80%81%E7%BB%91%E5%AE%9A%E5%9C%A8PHP%E4%B8%AD%E7%9A%84%E4%BD%BF%E7%94%A8.php
推薦學習:php視頻教程