PHP Class self 與 static 異同與使用詳解

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

這也是我之前的認知。

現(xiàn)在我們來回顧一下這兩個關(guān)鍵詞的一些常見用法:

// self 用法 1 :調(diào)用靜態(tài)成員屬性
<?php
class Person
{
    protected static $maxAddressCount = 5; // 收獲地址創(chuàng)建最大數(shù)量。

    public function test()
    {
        echo self::$maxAddressCount;
    }
}

$person = new Person();
$person->test();
// self 用法 2 :調(diào)用靜態(tài)方法
<?php
class Person
{
    protected static $maxAddressCount = 5; // 收獲地址創(chuàng)建最大數(shù)量。

    protected static function getMaxAddressCount()
    {
        return self::$maxAddressCount;
    }

    public function test()
    {
        echo self::getMaxAddressCount();
    }
}

$person = new Person();
$person->test();
// self 用法 3 :創(chuàng)建一個當前對象
<?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();

關(guān)于 static 關(guān)鍵詞的常見用法也在上面 3 個示例中得到綜合體現(xiàn)。

我深信上面的用法,任何一個入門的 PHPer 都是非常熟悉的?,F(xiàn)在我要講的是以下兩種方式:

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

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

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

PHP 官方把這種方式稱為:后期靜態(tài)綁定。

官方示例 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 都有一個靜態(tài)方法 who()。此時通過 B::test() 的時候,調(diào)用的實際上是 Class A 的 who() 方法。

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

就這引出了后期靜態(tài)綁定的概念。

官方示例 2:

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

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();

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

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容