站長資訊網
        最全最豐富的資訊網站

        詳解后期靜態綁定在PHP中的使用

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

        推薦:《PHP視頻教程》

        首先,我們通過一段代碼來引入后期靜態綁定這一概念:

        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()靜態方法時,self指向的是A類的who()方法,因此,輸出的是A。別激動,這是普通的靜態綁定。self關鍵字調用的內容取決于它定義時所在的類。也就是說不管怎么繼承,用哪個子類來調用test()方法,self關鍵字都會調用的是A類的who()方法。

        而后期靜態綁定呢?其實就有點像實例化的類對象,每個實例化的對象,調用的都是自身,而不是父類的屬性方法。普通的靜態調用可不是這樣,但是現實中我們又有這樣的需求,就像實例化對象的調用方式一樣來調用靜態屬性方法,這時,我們就可以使用static關鍵字來實現后期靜態綁定。

        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類自己了。

        官方文檔中的定義如下:

        當進行靜態方法調用時,該類名即為明確指定的那個(通常在 :: 運算符左側部分);當進行非靜態方法調用時,即為該對象所屬的類。

        該功能從語言內部角度考慮被命名為“后期靜態綁定”。“后期綁定”的意思是說,static:: 不再被解析為定義當前方法所在的類,而是在實際運行時計算的。也可以稱之為“靜態綁定”,因為它可以用于(但不限于)靜態方法的調用。

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

        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()方法,用來獲取當前調用的是哪個類。在靜態方法中可以根據調用方式判斷當前類是哪個類來進行其他的業務邏輯操作。另一個是forward_static_call()方法,用于靜態方法的調用。

        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()則是將參數使用數組進行傳遞。

        測試代碼: 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

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 精品视频一区二区三区免费| 国产A∨国片精品一区二区| 欧美日韩精品乱国产538| 亚洲精品一品区二品区三品区| 91午夜精品亚洲一区二区三区| 国产精品国产三级国产av品爱网| 亚洲AV无码之日韩精品| 国产成人精品高清不卡在线| 国产成人精品视频播放| 无码人妻精品一区二区三区东京热 | 欧美XXXX黑人又粗又长精品| 99久久精品国产综合一区| 国产国产精品人在线观看| 综合国产精品第一页| 欧美人与性动交α欧美精品| 国产午夜精品理论片| 97精品国产高清自在线看超| 国产亚洲福利精品一区| 成人国产精品高清在线观看| 国产亚洲色婷婷久久99精品| 久久国产亚洲精品无码| 亚洲精品无码久久久久去q| 日韩精品一区二区午夜成人版 | 亚洲精品无码mv在线观看网站 | 国产精品一区二区久久精品无码 | 国产一区二区三区在线观看精品| 91嫩草亚洲精品| 99久久精品九九亚洲精品| 91国在线啪精品一区| 久久久久99精品成人片| 精品午夜国产人人福利| 国产精品亚洲专区无码WEB| 亚洲精品免费视频| 香蕉久久夜色精品国产小说| 青青青国产精品国产精品久久久久 | 精品一区二区三区高清免费观看 | 国产日韩精品无码区免费专区国产| 亚洲精品欧美日韩| mm1313亚洲国产精品无码试看| 久久精品九九亚洲精品天堂| 久久伊人精品青青草原高清|