php使用trait遇到的一個問題


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();

按照我們之前的推斷,這次應該不會再輸出什么了吧!!對的沒錯,這次是按照我們的預期來得,所以上述原因是為什么呢?我也不曉得?待大神來答疑解惑。。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM