真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

后期靜態(tài)綁定在PHP中的使用方法

本篇內(nèi)容介紹了“后期靜態(tài)綁定在PHP中的使用方法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設,翔安企業(yè)網(wǎng)站建設,翔安品牌網(wǎng)站建設,網(wǎng)站定制,翔安網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,翔安網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

 

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

而后期靜態(tài)綁定呢?其實就有點像實例化的類對象,每個實例化的對象,調(diào)用的都是自身,而不是父類的屬性方法。普通的靜態(tài)調(diào)用可不是這樣,但是現(xiàn)實中我們又有這樣的需求,就像實例化對象的調(diào)用方式一樣來調(diào)用靜態(tài)屬性方法,這時,我們就可以使用static關鍵字來實現(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
 

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

官方文檔中的定義如下:

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

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

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

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()方法,用來獲取當前調(diào)用的是哪個類。在靜態(tài)方法中可以根據(jù)調(diào)用方式判斷當前類是哪個類來進行其他的業(yè)務邏輯操作。另一個是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ù)組進行傳遞。

測試代碼:https://github.com/zhangyue0503/dev-blog/blob/master/php/202001/source/%E5%90%8E%E6%9C%9F%E9%9D%99%E6%80%81%E7%BB%91%E5%AE%9A%E5%9C%A8PHP%E4%B8%AD%E7%9A%84%E4%BD%BF%E7%94%A8.php

參考文檔:https://www.php.net/manual/zh/language.oop5.late-static-bindings.phphttps://www.php.net/manual/zh/function.get-called-class.phphttps://www.php.net/manual/zh/function.forward-static-call.php

“后期靜態(tài)綁定在PHP中的使用方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!


網(wǎng)站題目:后期靜態(tài)綁定在PHP中的使用方法
分享網(wǎng)址:http://weahome.cn/article/igcejg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部