PHP中的trait

今天查看laravel的一些基礎實現時,才發現有trait這個關鍵詞,然后就趕緊去官方更新知識,以下是解析trait:

  • 解析
    • 自 PHP 5.4.0 起,PHP 實現了一種代碼復用的方法,稱為 trait;
    • Trait 是為類似 PHP 的單繼承語言而準備的一種代碼復用機制。Trait 為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類中復用 method。Trait 和 Class 組合的語義定義了一種減少復雜性的方式,避免傳統多繼承和 Mixin 類相關典型問題。
    • Trait 和 Class 相似,但僅僅旨在用細粒度和一致的方式來組合功能。 無法通過 trait 自身來實例化。它為傳統繼承增加了水平特性的組合;也就是說,應用的幾個 Class 之間不需要繼承
  • 優先級
    • 從基類繼承的成員會被 trait 插入的成員所覆蓋。優先順序是來自當前類的成員覆蓋了 trait 的方法,而 trait 則覆蓋了被繼承的方法
  • 沖突的解決
    • 如果兩個 trait 都插入了一個同名的方法,如果沒有明確解決沖突將會產生一個致命錯誤。

    • 為了解決多個 trait 在同一個類中的命名沖突,需要使用 insteadof 操作符來明確指定使用沖突方法中的哪一個。

    • 以上方式僅允許排除掉其它方法,as 操作符可以 為某個方法引入別名。 注意,as 操作符不會對方法進行重命名,也不會影響其方法

優先級示例

從基類繼承的成員被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆蓋。其行為 MyHelloWorld 類中定義的方法一致。優先順序是當前類中的方法會覆蓋 trait 方法,而 trait 方法又覆蓋了基類中的方法

class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}

class MyHelloWorld extends Base {
    use SayWorld;
}

$o = new MyHelloWorld();
$o->sayHello();  //Hello World!
再來一個例子
trait HelloWorld {
    public function sayHello() {
        echo 'Hello World!';
    }
}

class TheWorldIsNotEnough {
    use HelloWorld;
    public function sayHello() {
        echo 'Hello Universe!';
    }
}

$o = new TheWorldIsNotEnough();
$o->sayHello();  //Hello Universe!
  • 看到這,你應該明白了trait和類的使用更加靈活,而在trait中定義抽象成員、靜態成員、屬性都是類原來的感覺

本文如有不足之處請糾正,歡迎交流

參考:
<a >
類與對象->trait</a>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.PHP 對待對象的方式與引用和句柄相同,即每個變量都持有對象的引用,而不是整個對象的拷貝。 2.class 中...
    我在太行山下閱讀 547評論 0 0
  • Trait PHP 實現了一種代碼復用的方法,稱為trait。Trait是類似PHP的單繼承語言而準備的一種代碼復...
    NoFacePeace閱讀 187評論 0 0
  • 道光二十四年十一月,曾國藩給遠在老家的四個弟弟寫了一封家書。在家書中,曾國藩的大意是,大哥我承蒙祖宗遺澤,很幸運地...
    小鳳后EMBA閱讀 1,422評論 0 0
  • 首先,致謝: 簡書平臺,簡書薦書,小薦薦,漫畫手繪主編顧釉止,上海人民美術出版社! 感謝大家,才能讓我得以參加贈書...
    瓊柯閱讀 377評論 10 7
  • 一曲解曉東的《中國娃》,讓我想起了媽媽納的千層底兒。小時候,經常見到媽媽和門口的嬸子、大娘一起端著竹篾編的筐子,里...
    好書郎閱讀 827評論 0 1