http://php.net/manual/en/language.oop5.traits.php php
自PHP5.4.0起,PHP實現了代碼複用的一個方法,稱爲traints。 oop
Traits是一種爲相似PHP的單繼承語音而準備的代碼複用機制。Trait爲了減小單繼承語句的限制,使開發人員可以自由地在不一樣層次結構內獨立的類中複用方法集。Traits和類組合的語義是定義一種方法來減小複雜性,避免傳統繼承和混入類(Mixin)相關的典型問題。 this
Traits和一個類類似,但僅僅旨在用細粒度和一的方式來組合功能。Trait不能經過它自身來實例化。它爲傳統繼承增長了水平特性的組合;也就是說,應用類的成員不須要繼承。 .net
在我理解說白了就是在繼承類鏈中隔離了子類繼承父類的某些特性(就是子類「要用父類的特性的時候」,若是trait有,就優先調用trait的方法、屬性等)。 code
<?php /** * Date: 2016/3/28 * Time: 16:38 */ trait MyTrait { protected $var = "MyTrait_var"; protected $var1 = "MyTrait_var"; function __construct() { echo $this->var.PHP_EOL; } function a() { echo "a".PHP_EOL; } } interface MyInterface { function __construct(); function b(); } abstract class MyAbstract { protected $var2 = "MyAbstract_var"; use MyTrait; function b() { echo "b".PHP_EOL; } } class MyClass extends MyAbstract implements MyInterface { protected $var3 = "MyClass_var"; //也能夠在這裏引用,不區分繼承關係 //use MyTrait function c() { echo "c".PHP_EOL; } } $class = new MyClass(); $class->a(); $class->b(); $class->c();
輸出結果: 對象
總結: 繼承
① 從本質上說,trait和include文件的概念差很少 開發
②trait能夠更加方便的實現代碼複用,由於咱們用繼承關係實現的沒法在父類中訪問子類的private屬性與方法,而trait就和把代碼直接寫在對象裏的效果同樣 it
③使用trait時候應該堅定避免命名衝突,尤爲是同時使用多個trait時。 io
④若是產生了命名衝突,若是二者的可見性、初始值、static與否徹底相同,則trait中的會覆蓋掉對象中的,並拋出E_STRICT錯誤,不然會拋出E_COMPILE_ERROR錯誤,終止編譯。