php——trait

Trait是自 PHP 5.4.0 起添加的一個新特性,是 PHP 多重繼承的一種解決方案。例如,需要同時繼承兩個 Abstract Class, 這將會是件很麻煩的事情,Trait 就是為了解決這個問題。

下面是一個例子,類Demo同時繼承了Test1、Test2:

<?php
trait Test1{
    public function add($a, $b){
        echo $a + $b;
    }
}

trait Test2{
    public function sub($a, $b){
        echo $a - $b;
    }
}

class Demo{
    use Test1,Test2;
}

$obj = new Demo();
$obj->add(3, 5); // 8

$obj->sub(3, 5); // -2

一些特性
1、優(yōu)先級:當(dāng)前類 > trait > 基類 。 即當(dāng)前類中的方法會覆蓋 trait 方法,而 trait 方法又覆蓋了基類中的方法。
2、多個 trait: 通過逗號分隔,在 use 聲明列出多個 trait,可以都插入到一個類中。
3、沖突的解決:
如果兩個 trait 都插入了一個同名的方法,如果沒有明確解決沖突將會產(chǎn)生一個致命錯誤。
為了解決多個 trait 在同一個類中的命名沖突,需要使用 insteadof 操作符來明確指定使用沖突方法中的哪一個。
以上方式僅允許排除掉其它方法,as 操作符可以將其中一個沖突的方法以另一個名稱來引入。

<?php
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;
    }
}

class Aliased_Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
        B::bigTalk as talk;
    }
}
?>

4、trait嵌套:Trait 之間也可以相互的嵌套:在 trait 定義時通過使用一個或多個 trait,它能夠組合其它 trait 中的部分或全部成員。
5、Trait 的抽象方法:我們可以在 Trait 中聲明需要實現(xiàn)的抽象方法,這樣能使使用它的 Class 必須實現(xiàn)它。

需要注意的幾點:
Trait 會覆蓋調(diào)用類繼承的父類方法
Trait 無法如 Class 一樣使用 new 實例化
單個 Trait 可由多個 Trait 組成
在單個 Class 中,可以使用多個 Trait
Trait 支持修飾詞(modifiers),例如 final、static、abstract
我們能使用 insteadof 以及 as 操作符解決 Trait 之間的沖突

一些看法
坦白講,第一眼看到 Trait 對它并沒有任何好感。PHP5 以來帶來的新特性已經(jīng)足夠得多,而且讓開發(fā)者們有點應(yīng)接不暇。

同時,Trait 更像是程序員的“語法糖”,然而它提供便利的同時可能會造成巨大的隱患。

針對類中已經(jīng)實現(xiàn)的方法,Trait 沒有效果。

?著作權(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)容

  • Scala與Java的關(guān)系 Scala與Java的關(guān)系是非常緊密的!! 因為Scala是基于Java虛擬機(jī),也就是...
    燈火gg閱讀 3,608評論 1 24
  • Trait PHP 實現(xiàn)了一種代碼復(fù)用的方法,稱為trait。Trait是類似PHP的單繼承語言而準(zhǔn)備的一種代碼復(fù)...
    NoFacePeace閱讀 211評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,551評論 19 139
  • trait是從PHP 5.4開始就有的語法特性,與Mixin和Behaviors模式有相似之處。triat 突破了...
    切糕糕閱讀 1,039評論 0 1
  • (文/李遠(yuǎn)紅) 和一棵樹的對話 有好幾種目光 仰視、俯視或者平視 你們怎么看 當(dāng)它是樹苗時 我要蹲下來才能抱住它 ...
    李遠(yuǎn)紅閱讀 240評論 0 2

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