PHP語言的一個問題是單繼承,這意味着類只能繼承一個其餘的類。然而,不少狀況下須要多繼承,好比繼承多個類的方法,以防止代碼的重複。對於但繼承模式好仍是多繼承模式好,不在本文探討範圍內。php
爲了解決PHP語言單繼承存在的不足,在PHP 5.4 中添加了新特性 trait,Trait 是一種代碼複用機制,爲了減小單繼承語言的限制,使開發人員可以自由地在不一樣層次結構內獨立的類中複用 method。Trait 和 Class 組合的語義定義了一種減小複雜性的方式,避免傳統多繼承問題。segmentfault
Trait是一組方法,能夠包含在類中進行使用,單trait不可實例化。微信
trait Sharable { public function share($item) { return 'share this item'; } }
你能夠在其餘類中包含這個traitpost
class Post { use Sharable; } class Comment { use Sharable; }
若是你實例化上面的類,就能夠調用trait中的方法學習
$post = new Post; echo $post->share(''); // 'share this item' $comment = new Comment; echo $comment->share(''); // 'share this item'
解析上面例子是如何工做的:this
例子中的Post 和 Comment 的實例都成功調用了方法share(),儘管類自己沒有share()方法,就是由於類中使用了trait Shareable.spa
trait的基本原理就是在運行時「複製和粘貼"了方法代碼,即將trait複製到Post和Comment類中,當你實例化對象時,share()方法就可使用了。code
總結:
Trait 沒法如 Class 同樣使用 new 實例化
單個 Trait 可由多個 Trait 組成
在單個 Class 中,可使用多個 Trait
使用trait時候應該堅定避免命名衝突,尤爲是同時使用多個trait時。對象
上篇文章: 我在北京寫代碼 ,你在哪兒?繼承
掃描關注微信公衆號:專一PHP學習