PHP-trait-筆記
阿新 • • 發佈:2018-12-10
trait
trait是一種程式碼複用的方法,用於模擬實現多繼承(PHP是單繼承語言)
注意:
1.trait中的寫法和普通的類寫法一樣(不過一般我們只寫方法)
2.如果trait中的屬性與類中的屬性同名,則會報告錯誤
3.trait無法被new例項化
4.trait可以巢狀trait
原始碼:
<?php trait A { function go() { echo "Go<br />"; } } trait B { use A;//巢狀trai A function ao() { echo "Ao<br />"; } } class C { use B;//複用trait B的程式碼 } $p = new C(); $p->go();//呼叫複用的程式碼 $p->ao(); ?>
顯示:
Go Ao
解決方法同名問題:
關鍵字:insteadof 代替(instead of) as 別名
原始碼:
<?php trait A { function go() { echo "去那<br />"; } } trait B { function go() { echo "走呀<br />";//方法名與trait A中的重複 } } class C { use A,B { A::go insteadof B;//trait A中的go()代替trait B中的go() B::go as goB;//將trait B中的go取個別名為goB } } $p = new C(); $p->go();//呼叫的trait A中的go()方法 $p->goB();//呼叫取別名的trait B的go()方法 ?>
顯示:
去那 走呀
關於優先順序問題:
子類是先繼承父類,再使用trait複用程式碼,所以當繼承和trait同時使用的時候父類的成員方法與trait方法同名時會被trait方法重寫,但是我們可以通過parent解決這個問題
原始碼:
<?php class A { function Ton() { echo "你"; } } trait B { function Ton()//該方法於class A中的Ton()方法同名 { parent::Ton();//我們可以通過呼叫原來的方法來解決重寫問題 echo "好"; } } class C extends A { use B; } $p = new C(); $p->Ton(); ?>
顯示:
你好