溫馨提示×

溫馨提示×

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

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

PHP中使用后期靜態綁定的示例分析

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

這篇文章給大家分享的是有關PHP中使用后期靜態綁定的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

后期靜態綁定在PHP中的使用

什么叫后期靜態綁定呢?其實我們在之前的文章PHP中的static中已經說過這個東西了。今天我們還是再次深入的理解一下這個概念。

首先,我們通過一段代碼來引入后期靜態綁定這一概念:

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關鍵字,當使用B類調用test()靜態方法時,self指向的是A類的who()方法,因此,輸出的是A。別激動,這是普通的靜態綁定。self關鍵字調用的內容取決于它定義時所在的類。也就是說不管怎么繼承,用哪個子類來調用test()方法,self關鍵字都會調用的是A類的who()方法。

而后期靜態綁定呢?其實就有點像實例化的類對象,每個實例化的對象,調用的都是自身,而不是父類的屬性方法。普通的靜態調用可不是這樣,但是現實中我們又有這樣的需求,就像實例化對象的調用方式一樣來調用靜態屬性方法,這時,我們就可以使用static關鍵字來實現后期靜態綁定。

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

當使用static關鍵字后,這里D類調用的test()方法內部調用的who()就是D類自己了。

官方文檔中的定義如下:

當進行靜態方法調用時,該類名即為明確指定的那個(通常在 :: 運算符左側部分);當進行非靜態方法調用時,即為該對象所屬的類。

該功能從語言內部角度考慮被命名為“后期靜態綁定”?!昂笃诮壎ā钡囊馑际钦f,static:: 不再被解析為定義當前方法所在的類,而是在實際運行時計算的。也可以稱之為“靜態綁定”,因為它可以用于(但不限于)靜態方法的調用。

除了self和static關鍵字外,我們還有一個parent關鍵字,這個關鍵字的意義就很明顯了,調用父類的靜態內容。我們同時用三個關鍵字一起來進行測試:

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()方法,用來獲取當前調用的是哪個類。在靜態方法中可以根據調用方式判斷當前類是哪個類來進行其他的業務邏輯操作。另一個是forward_static_call()方法,用于靜態方法的調用。

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()不指定類名的話,將調用全局的方法。forward_static_call_array()則是將參數使用數組進行傳遞。

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

向AI問一下細節

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

php
AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女