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

        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號
        主站蜘蛛池模板: 亚洲第一永久AV网站久久精品男人的天堂AV| 99re这里只有精品国产精品| 国产精品一二三区| 69SEX久久精品国产麻豆| 国产成人精品日本亚洲网址| 欧美亚洲精品中文字幕乱码免费高清| 亚洲精品国产福利一二区| 国产精品自产拍在线观看| 久久亚洲精品无码AV红樱桃| 国产精品91视频| 久久精品国产久精国产思思| 久久国产精品成人免费| 国产精品免费看久久久香蕉| 亚洲А∨精品天堂在线 | 无码日韩精品一区二区免费| 国产美女久久精品香蕉69| 四虎影视国产精品永久在线| 久久狠狠一本精品综合网| 最新精品亚洲成a人在线观看| 99久久久精品免费观看国产| 亚洲AV无码精品色午夜果冻不卡| 日本精品一区二区久久久| 国产成人vr精品a视频| 欧美精品久久久久久久自慰| 亚洲一区精品无码| 久久精品国产91久久综合麻豆自制| 久久精品国产久精国产| 国产99精品久久| 99热精品在线观看| 第一福利永久视频精品| 国产成人精品久久二区二区| 国产精品99久久久久久人| 国产亚洲欧洲精品| 青青草原综合久久大伊人精品| 国产精品嫩草影院一二三区入口 | 国产精品五月天强力打造| 日韩欧精品无码视频无删节| 亚洲中文久久精品无码| 人人妻人人澡人人爽人人精品97 | 无码人妻丰满熟妇精品区| 无码日韩人妻精品久久蜜桃|