php - trait

本質(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ù)了會報錯, 解決方案:
    1. 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方法
      ????????}
    2. 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ù)。

    相關(guān)閱讀更多精彩內(nèi)容

    • 官方解釋 自 PHP 5.4.0 起,PHP 實現(xiàn)了一種代碼復(fù)用的方法,稱為 trait。 Trait...
      鈞輝閱讀 328評論 0 1
    • 查看框架源碼的時候,發(fā)現(xiàn)trait這一個東西,在它里面可以定義屬性和方法,很像類,但是卻不是類。 1.和類的區(qū)別:...
      JuMinggniMuJ閱讀 632評論 0 0
    • 自PHP5.4之前,PHP面向?qū)ο笮枰獜?fù)用代碼的方式是使用類的繼承。但PHP只支持單繼承,在應(yīng)對較復(fù)雜的業(yè)務(wù)邏輯中...
      閑睡貓閱讀 411評論 0 2
    • Trait PHP 實現(xiàn)了一種代碼復(fù)用的方法,稱為trait。Trait是類似PHP的單繼承語言而準(zhǔn)備的一種代碼復(fù)...
      NoFacePeace閱讀 211評論 0 0
    • Trait是自 PHP 5.4.0 起添加的一個新特性,是 PHP 多重繼承的一種解決方案。例如,需要同時繼承兩個...
      BULL_DEBUG閱讀 472評論 0 2

    友情鏈接更多精彩內(nèi)容