本篇內(nèi)容介紹了“后期靜態(tài)綁定在PHP中的使用方法”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),翔安企業(yè)網(wǎng)站建設(shè),翔安品牌網(wǎng)站建設(shè),網(wǎng)站定制,翔安網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,翔安網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
什么叫后期靜態(tài)綁定呢?其實(shí)我們?cè)谥暗奈恼翽HP中的static中已經(jīng)說(shuō)過(guò)這個(gè)東西了。今天我們還是再次深入的理解一下這個(gè)概念。
首先,我們通過(guò)一段代碼來(lái)引入后期靜態(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類(lèi)調(diào)用test()靜態(tài)方法時(shí),self指向的是A類(lèi)的who()方法,因此,輸出的是A。別激動(dòng),這是普通的靜態(tài)綁定。self關(guān)鍵字調(diào)用的內(nèi)容取決于它定義時(shí)所在的類(lèi)。也就是說(shuō)不管怎么繼承,用哪個(gè)子類(lèi)來(lái)調(diào)用test()方法,self關(guān)鍵字都會(huì)調(diào)用的是A類(lèi)的who()方法。
而后期靜態(tài)綁定呢?其實(shí)就有點(diǎn)像實(shí)例化的類(lèi)對(duì)象,每個(gè)實(shí)例化的對(duì)象,調(diào)用的都是自身,而不是父類(lèi)的屬性方法。普通的靜態(tài)調(diào)用可不是這樣,但是現(xiàn)實(shí)中我們又有這樣的需求,就像實(shí)例化對(duì)象的調(diào)用方式一樣來(lái)調(diào)用靜態(tài)屬性方法,這時(shí),我們就可以使用static關(guān)鍵字來(lái)實(shí)現(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類(lèi)調(diào)用的test()方法內(nèi)部調(diào)用的who()就是D類(lèi)自己了。
官方文檔中的定義如下:
當(dāng)進(jìn)行靜態(tài)方法調(diào)用時(shí),該類(lèi)名即為明確指定的那個(gè)(通常在 :: 運(yùn)算符左側(cè)部分);當(dāng)進(jìn)行非靜態(tài)方法調(diào)用時(shí),即為該對(duì)象所屬的類(lèi)。
該功能從語(yǔ)言?xún)?nèi)部角度考慮被命名為“后期靜態(tài)綁定”?!昂笃诮壎ā钡囊馑际钦f(shuō),static:: 不再被解析為定義當(dāng)前方法所在的類(lèi),而是在實(shí)際運(yùn)行時(shí)計(jì)算的。也可以稱(chēng)之為“靜態(tài)綁定”,因?yàn)樗梢杂糜冢ǖ幌抻冢╈o態(tài)方法的調(diào)用。
除了self和static關(guān)鍵字外,我們還有一個(gè)parent關(guān)鍵字,這個(gè)關(guān)鍵字的意義就很明顯了,調(diào)用父類(lèi)的靜態(tài)內(nèi)容。我們同時(shí)用三個(gè)關(guān)鍵字一起來(lái)進(jìn)行測(cè)試:
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
最后,我們?cè)賮?lái)看兩個(gè)PHP的方法,一個(gè)是get_called_class()方法,用來(lái)獲取當(dāng)前調(diào)用的是哪個(gè)類(lèi)。在靜態(tài)方法中可以根據(jù)調(diào)用方式判斷當(dāng)前類(lèi)是哪個(gè)類(lèi)來(lái)進(jìn)行其他的業(yè)務(wù)邏輯操作。另一個(gè)是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()不指定類(lèi)名的話(huà),將調(diào)用全局的方法。forward_static_call_array()則是將參數(shù)使用數(shù)組進(jìn)行傳遞。
測(cè)試代碼: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è)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
網(wǎng)站欄目:后期靜態(tài)綁定在PHP中的使用方法
標(biāo)題路徑:http://aaarwkj.com/article26/igcejg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、云服務(wù)器、網(wǎng)站營(yíng)銷(xiāo)、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)