1-9(OOP)PHP之traits技術

traits:

它使得類裏面的代碼(主要指屬性和方法)更加靈活的被複用

traits 和 include的有點相似

  • 通過include技術我們可以引入文件
  • 通過traits技術我們可以引入代碼

 

實際使用:

在很多個類中如果有一些方法複用時,我們能做的只能是把這些重複的方法放在他們共同的父類中,但是這些類已經有父類了怎麼辦?

沒有辦法使一個類同時繼承多個類,這樣我們對於這些需要重複使用的方法就沒辦法自由的編寫了,如果給他們不同的父類加上這些

方法,就會有很多重複的代碼,不利於後期維護!

 

1)用traits技術解決這個問題

trait trait名稱{

           需要重複使用的方法可以放在這裏,和類裏面編寫的方法一樣;

}

注:trait名稱最好以 t 開頭

trait tKnife{
    public function pencil($pencil){
        echo $pencil.'ok!';
    }
}

 

2)trait使用方法

在類的內部使用:

use trait 名稱

即可使用被use的trait裏面的各種方法,類似於include

 

3)優先級

從基本類繼承的成員被trait插入的成員所覆蓋,優先順序是來自當前類的成員覆蓋了trait的方法,而trait則覆蓋了被繼承的方法

 

4)通過逗號分隔,在use聲明列出多個trait,可以插入到一個類中

use trait 名稱1,trait 名稱2;

 

5)衝突的解決

如果兩個trait都插入了一個同名的算法,如果沒有明確衝突將會產生一個致命錯誤

      1.爲解決多個trait在同一個類中的命名衝突,需要使用insteadof操作符來明確指定使用衝突方法中的哪一個

trait A{
    public function smallTalk(){
        echo 'a';
    }
    public function bigtalk(){
        echo 'A';
    }
}

trait B{
    public function smallTalk(){
        echo 'b';
    }
    public function bigTalk(){
        echo 'B';
    }
}

class Talker{
    use A,B{
        B::smallTalk insteadof A;
        A::bigtalk insteadof B;
    }
}

 

     2. 

class Aliased_Talker{
    use A,B{
        B::smallTalk insteadof A;
        A::bigtalk insteadof B;
        B::bigTalk as talk;
    }
}
//注:在使用as前必須解決掉衝突問題

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章