站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        在PHP中如何使用后期靜態(tài)綁定

        本篇文章給大家介紹一下在PHP中使用后期靜態(tài)綁定的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。

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

        而后期靜態(tài)綁定呢?其實就有點像實例化的類對象,每個實例化的對象,調(diào)用的都是自身,而不是父類的屬性方法。普通的靜態(tài)調(diào)用可不是這樣,但是現(xiàn)實中我們又有這樣的需求,就像實例化對象的調(diào)用方式一樣來調(diào)用靜態(tài)屬性方法,這時,我們就可以使用static關(guān)鍵字來實現(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

        當(dāng)使用static關(guān)鍵字后,這里D類調(diào)用的test()方法內(nèi)部調(diào)用的who()就是D類自己了。

        官方文檔中的定義如下:

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

        該功能從語言內(nèi)部角度考慮被命名為“后期靜態(tài)綁定”?!昂笃诮壎ā钡囊馑际钦f,static:: 不再被解析為定義當(dāng)前方法所在的類,而是在實際運行時計算的。也可以稱之為“靜態(tài)綁定”,因為它可以用于(但不限于)靜態(tài)方法的調(diào)用。

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

        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()方法,用來獲取當(dāng)前調(diào)用的是哪個類。在靜態(tài)方法中可以根據(jù)調(diào)用方式判斷當(dāng)前類是哪個類來進行其他的業(yè)務(wù)邏輯操作。另一個是forward_static_call()方法,用于靜態(tài)方法的調(diào)用。

        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()不指定類名的話,將調(diào)用全局的方法。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

        推薦學(xué)習(xí):php視頻教程

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 国产成人精品视频2021| 久久夜色精品国产www| 精品伦精品一区二区三区视频 | 2020国产精品| 国产微拍精品一区二区| 精品国产免费一区二区三区香蕉 | 久久99精品国产一区二区三区| 中文字幕久精品免费视频| 国产精品99爱免费视频| 国产92成人精品视频免费| 久久亚洲私人国产精品| 亚洲AV无码成人精品区狼人影院 | 老司机午夜网站国内精品久久久久久久久| 久久亚洲精品视频| 国产精品熟女一区二区| 中文字幕精品无码一区二区| 精品国产AⅤ一区二区三区4区| 92国产精品午夜福利免费| 久久亚洲欧美日本精品| 国产精品亚洲欧美一区麻豆 | 亚洲AV无码久久精品蜜桃| 欧美精品丝袜久久久中文字幕| 国产精品欧美久久久久无广告 | 亚洲日韩一页精品发布| 青青草97国产精品免费观看| 久久精品国产亚洲一区二区三区| 国产精品人人做人人爽人人添| 国产精品视频一区国模私拍 | 亚洲级αV无码毛片久久精品| 蜜桃麻豆www久久国产精品| 国产中文在线亚洲精品官网| 国产精品成人观看视频| 99久久免费国产精品| 四虎影视国产精品亚洲精品hd| 久久精品www| 日韩精品www| 97久视频精品视频在线老司机| 视频二区国产精品职场同事| 日韩精品www| 99热热久久这里只有精品68| 99热成人精品国产免男男|