东京热成人网站_XX另类XX伦理XXAV_亚洲精品无码成人AAA片_高清av中文字幕无码_手机看片国产欧美日韩高清_bd美妙第进化型

咨詢(xún)電話:
15628812133
02
2018/12

PHP新特性Trait

發(fā)布時(shí)間:2018-12-02 19:35:10
發(fā)布者:pengyifeng
瀏覽量:
0

Trait是PHP 5.4引入的新概念,看上去既像類(lèi)又像接口,其實(shí)都不是,Trait可以看做類(lèi)的部分實(shí)現(xiàn),可以混入一個(gè)或多個(gè)現(xiàn)有的PHP類(lèi)中,其作用有兩個(gè):表明類(lèi)可以做什么;提供模塊化實(shí)現(xiàn)。Trait是一種代碼復(fù)用技術(shù),為PHP的單繼承限制提供了一套靈活的代碼復(fù)用機(jī)制。

為什么使用Trait

PHP語(yǔ)言使用一種典型的單繼承模型,在這種模型中,我們先編寫(xiě)一個(gè)通用的根類(lèi),實(shí)現(xiàn)基本的功能,然后擴(kuò)展這個(gè)根類(lèi),創(chuàng)建更具體的子類(lèi),直接從父類(lèi)繼承實(shí)現(xiàn)。這叫做繼承層次結(jié)構(gòu),很多編程語(yǔ)言都使用這個(gè)模式。大多數(shù)時(shí)候這種典型的繼承模型能夠良好運(yùn)作,但是如果想讓兩個(gè)無(wú)關(guān)的PHP類(lèi)具有類(lèi)似的行為,應(yīng)該怎么做呢?

Trait就是為了解決這種問(wèn)題而誕生的。Trait能夠把模塊化的實(shí)現(xiàn)方式注入多個(gè)無(wú)關(guān)的類(lèi)中,從而提高代碼復(fù)用,符合DRY(Don’t Repeat Yourself)原則。比如Laravel底層用戶(hù)認(rèn)證相關(guān)邏輯以及軟刪除實(shí)現(xiàn)等地方都使用了Trait來(lái)實(shí)現(xiàn)。以Laravel自帶的AuthController為例,其中的登錄、注冊(cè)以及登錄失敗嘗試次數(shù)都是通過(guò)Trait實(shí)現(xiàn):


如何創(chuàng)建Trait

創(chuàng)建Trait很簡(jiǎn)單,跟創(chuàng)建類(lèi)有點(diǎn)類(lèi)似,只不過(guò)使用的關(guān)鍵字是trait而不是class,以上述ThrottlesLogin為例:

PHP新特性Trait.jpg

我們通過(guò)trait聲明定義的是一個(gè)Trait,然后我們可以在這個(gè)Trait中像類(lèi)一樣定義要使用的屬性和方法。

此外Trait支持嵌套和組合,即通過(guò)一個(gè)或多個(gè)Trait(多個(gè)用,分隔)組合成一個(gè)Trait,比如

PHP新特性Trait.jpg

使用多個(gè)Trait可能會(huì)引起命名沖突問(wèn)題,上面的代碼給出了解決方案:使用insteadof關(guān)鍵字,如果AuthenticatesUsers和RegistersUsers中都定義了redirectPath和getGuard方法,那么將從AuthenticatesUsers中獲取對(duì)應(yīng)方法而不是RegistersUsers。另外還可以使用as關(guān)鍵字為方法起個(gè)別名,這樣也可以避免命名沖突。

此外,這里可能沒(méi)有完整列出,Trait中還支持定義抽象方法和靜態(tài)方法,其中抽象方法必須在使用它的類(lèi)中實(shí)現(xiàn)。

這里還需要聲明的一點(diǎn)是調(diào)用方法的優(yōu)先級(jí):調(diào)用類(lèi)>Trait>父類(lèi)(如果有的話),方法可以覆蓋,但屬性不行,如果Trait中定義了一個(gè)屬性,如果調(diào)用類(lèi)中也定義這個(gè)屬性則會(huì)報(bào)錯(cuò)。

如何使用Trait

Trait的使用方法也很簡(jiǎn)單,上面已經(jīng)顯示的很清楚明了,即使用use關(guān)鍵字。

可能你已經(jīng)注意到,命名空間和Trait使用的都是use關(guān)鍵字,不同之處在于導(dǎo)入位置,命名空間在類(lèi)的定義體外導(dǎo)入,而Trait在類(lèi)的定義體內(nèi)導(dǎo)入。

PHP新特性Trait.jpg


關(guān)鍵詞:
返回列表
相關(guān)文章