本質(zhì)上trait本身是對類的一個擴(kuò)展,在trait中使用$this ,self,static,parent都與當(dāng)前類一樣,zend底層將trait代碼嵌入到類當(dāng)中,相當(dāng)于底層幫我們實現(xiàn)了代碼復(fù)制功能
trait、繼承和實例化的區(qū)別:
對于當(dāng)前一個類需要用到另一個或多個類的方法的情況,我們一般會想到的方式有繼承、直接實例化另外一個或多個類等等的方法,下面來對比一下這些方法和Trait類的區(qū)別:
繼承方式:對于繼承,可以完美地復(fù)用另一個類的一些方法,但是對于需要復(fù)用多個類的方法時,PHP是不支持多繼承的,而且只能訪問public和protected方法;與直接實例化的區(qū)別:我們也可以在當(dāng)前類中直接實例化要用到的A類與B類,但是這種方法在控制訪問范圍反面,只允許訪問A、B類中public的方法;使用Trait類則完全將A、B兩個類的方法導(dǎo)入到當(dāng)前類中,可以視為當(dāng)前類的一部分,唯一區(qū)別是可以存在于當(dāng)前類同名的方法,此時由優(yōu)先級順序來控制。調(diào)用
當(dāng)前類, 可以直接調(diào)用 trait 中的所有方法和屬性(因為相當(dāng)于調(diào)用的是當(dāng)前類中的屬性和方法,所以trait 中的私有方法和屬性都可以被調(diào)用)當(dāng)前類的子類不可以調(diào)用 trait 中的私有方法和屬性當(dāng)前類和 trait 類中的方法會被重寫, 但屬性不會, 如果當(dāng)前類和 trait 類中包含相同的屬性則會報錯.?但是當(dāng)前類的子類的屬性可以和 trait 里重復(fù)方法重復(fù)時的調(diào)用順序: 當(dāng)前類 > trait類> 父類其他
同一個類中可以同時trait 多個類Trait 中還支持定義抽象方法和靜態(tài)方法,其中抽象方法必須在使用它的類中實現(xiàn)如果引入的 trait 類中有方法重復(fù)了會報錯, 解決方案:
-
insteadof: 通過該關(guān)鍵字指定方法名沖突時該使用哪個Trait類的方法
????use?A,?B?{
??????????B::a?insteadof?A;?//a方法沖突時使用B類的a方法而不使用A類的a方法
??????????A::b?insteadof?B;?//b方法沖突時使用A類的b方法而不使用B類的b方法
????????}
-
as: 通過as關(guān)鍵字將同名方法指定為一個別名,且僅作用于當(dāng)前類中
????use?A,?B?{
??????B::a?as?c;?//聲明B類的a方法為c,作用于該類
??????A::b?as?d;?//聲明A類的b方法為d,作用于該類????}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。