php是單繼承語言,也是就是一個類只能繼承一個單獨的原始類
自PHP5.4.0起,PHP實現了一種代碼復用的方法,稱為Trait
trait 是在一些類(Class)的應該具備的特定的屬性或方法,而同父級的另外一些類應該避免包含這些屬性和方法情況下使用的.
類成員優先級為:當前類>Trait>父類
1 trait funcA {
2 // 二、
3 // trait關鍵字的使用和類定義一樣
4 // 也是可以定義方法和屬性的
5 public function a () { 6 echo "hello "; 7 } 8 public function b () { 9 echo "word "; 10 } 11 public function mm () { 12 echo "mmp"; 13 } 14 public function c () { 15 $this->a(); 16 $this->b(); 17 } 18 } 19 class A { 20 // 在類A中使用use關鍵字,可以實現復用func里面的方法和屬性(變相的繼承了func中的屬性和方法) 21 use funcA; 22 } 23 $a = new A(); 24 $a->c();
上面這段代碼,最終輸出結果為hello hello word
經過斷點調試,發現在實例化對象的時候,上述代碼中的 a方法被執行了(難道是巧合?換個姿勢在測試一次)
1 trait funcA {
2 // 二、
3 // trait關鍵字的使用和類定義一樣
4 // 也是可以定義方法和屬性的
5 public function a () { 6 echo "hello"; 7 } 8 public function b () { 9 echo "word"; 10 } 11 public function c () { 12 $this->a(); 13 $this->b(); 14 } 15 } 16 class B { 17 // 在類A中使用use關鍵字,可以實現復用func里面的方法和屬性(變相的繼承了func中的屬性和方法) 18 use funcA; 19 } 20 $a = new B(); 21 // $a->c();
按道理來說應該什么也不輸出的,不巧的是,在實例化的時候trait中的b方法還是被執行了(那我們再換個姿勢來測試一下?)
trait funcA {
// 二、
// trait關鍵字的使用和類定義一樣
// 也是可以定義方法和屬性的
public function test1 () { echo "hello"; } public function test2 () { echo "word"; } public function c () { $this->test1(); $this->test2(); } } class A { // 在類A中使用use關鍵字,可以實現復用func里面的方法和屬性(變相的繼承了func中的屬性和方法) use funcA; } $a = new A();
按照我們之前的推斷,這次應該不會再輸出什么了吧!!對的沒錯,這次是按照我們的預期來得,所以上述原因是為什么呢?我也不曉得?待大神來答疑解惑。。。。。