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

        PHP Class self與static有什么區別?都怎么用?

        對于大多數 PHPer 來說,self 與 static 兩個 PHP 關鍵詞都不算陌生。我們學會通過self::xxxx這種方式來調用當前類的靜態屬性和方法。而 static 呢?想必很多人只知道它是用于定義一個靜態方法和類屬性關鍵詞。

        這也是我之前的認知。

        現在我們來回顧一下這兩個關鍵詞的一些常見用法:

        // self 用法 1 :調用靜態成員屬性 <?php class Person {     protected static $maxAddressCount = 5; // 收獲地址創建最大數量。      public function test()     {         echo self::$maxAddressCount;     } }  $person = new Person(); $person->test();
        // self 用法 2 :調用靜態方法 <?php class Person {     protected static $maxAddressCount = 5; // 收獲地址創建最大數量。      protected static function getMaxAddressCount()     {         return self::$maxAddressCount;     }      public function test()     {         echo self::getMaxAddressCount();     } }  $person = new Person(); $person->test();
        // self 用法 3 :創建一個當前對象 <?php // 單例示例 class Person {     private static $instance = null;      private function __construct() {}      final public static function getInstance()      {         if (self::$instance == null) {             self::$instance = new self;         }         return self::$instance;     }      public function test()     {         echo "hello world!";     } }  $person = Person::getInstance(); $person->test();

        關于 static 關鍵詞的常見用法也在上面 3 個示例中得到綜合體現。

        我深信上面的用法,任何一個入門的 PHPer 都是非常熟悉的。現在我要講的是以下兩種方式:

        new self() 與 new static() 的區別?

        我相信很多人都知道new self()創建一個當前類的對象,并不知道new static()也能創建一個當前類的對象。

        關于new static()這種用法呢,在官方文檔有說明。地址:https://www.php.net/manual/zh/language.oop5.late-static-bindings.php

        PHP 官方把這種方式稱為:后期靜態綁定。

        官方示例 1:

        <?php class A {     public static function who() {         echo __CLASS__;     }     public static function test() {         self::who();     } }  class B extends A {     public static function who() {         echo __CLASS__;     } }  B::test();

        因為 Class B 繼承了 Class A。 A 與 B 都有一個靜態方法who()。此時通過B::test()的時候,調用的實際上是 Class A 的who()方法。

        因為子類 Class B 的靜態方法who()屬于在 Class A 之后的子類里面才定義的。而 PHP 的默認特性只允許調用最先定義的。

        就這引出了后期靜態綁定的概念。

        官方示例 2:

        <?php class A {     public static function who() {         echo __CLASS__;     }     public static function test() {         static::who(); // 后期靜態綁定從這里開始     } }  class B extends A {     public static function who() {         echo __CLASS__;     } }  B::test();

        我們把 Class A 里面的test()方法體的self更改為static之后,static 代表的永遠是指向調用類。也就是說雖然在 Class A 父類里面定義的方法與子類有同名沖突的情況。但是,當子類調用的時候,那么自動切換到子類的靜態同名方法。取決于調用者。

        大家可以通過運行以上兩個示例進行理解。

        之所以會有本篇小節內容。是因為我在實際運行當中要繼承單例方法導致了這個問題。所以,才牽扯出這個特性。

        推薦學習:《PHP視頻教程》

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 国产精品1区2区| 国产福利精品在线观看| 国产99精品一区二区三区免费| 亚洲精品国产品国语在线| 99久久综合国产精品二区| 精品国产VA久久久久久久冰| 亚洲A∨午夜成人片精品网站| 国产国产成人久久精品| 精品国精品国产| av国内精品久久久久影院| 性欧洲精品videos| 亚洲欧美日韩国产精品影院| 精品一区二区三区高清免费观看| 高清日韩精品一区二区三区 | 日韩精品真人荷官无码| 亚洲精品国产精品国自产观看 | 国产成人精品无码片区在线观看| 亚洲欧美日韩国产精品 | 人人妻人人澡人人爽人人精品97| 亚洲国产成人a精品不卡在线| 久久精品国产亚洲Aⅴ蜜臀色欲| 国产精品欧美久久久久无广告| 华人在线精品免费观看| 国产精品久久成人影院| 国产精品素人搭讪在线播放| 国产91精品在线| 国内精品51视频在线观看| 99国产精品国产精品九九| 国产精品美女久久久久网| 97久久久久人妻精品专区| 成人国内精品久久久久一区 | 精品人妻系列无码天堂| 欧美精品久久久久久久自慰| 人妻少妇精品中文字幕AV | 在线观看国产精品日韩av| 在线中文字幕精品第5页| 中文字幕无码精品三级在线电影| 无码人妻精品一区二区三区夜夜嗨| 色欲久久久天天天综合网精品| 久久亚洲私人国产精品| 99久久人妻无码精品系列蜜桃 |