溫馨提示×

溫馨提示×

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

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

PHP中使用后期靜態(tài)綁定的示例分析

發(fā)布時間:2021-06-08 09:32:59 來源:億速云 閱讀:136 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關(guān)PHP中使用后期靜態(tài)綁定的示例分析的內(nè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ù)組進行傳遞。

感謝各位的閱讀!關(guān)于“PHP中使用后期靜態(tài)綁定的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI