中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中Class self與static有哪些區別

發布時間:2021-09-09 11:11:42 來源:億速云 閱讀:134 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關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中Class self與static有哪些區別”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

邹平县| 潞城市| 浦东新区| 绍兴县| 无为县| 桦川县| 黎城县| 象州县| 石嘴山市| 湖口县| 武胜县| 斗六市| 句容市| 绿春县| 九龙坡区| 原平市| 朔州市| 庐江县| 土默特左旗| 太保市| 永寿县| 名山县| 泸定县| 电白县| 高州市| 磴口县| 思茅市| 莱芜市| 哈巴河县| 苍溪县| 常熟市| 广宗县| 蒙山县| 屏边| 龙海市| 攀枝花市| 咸宁市| 米林县| 扶余县| 桦甸市| 南靖县|