[請益] 關於trait的使用

看板PHP作者 (akakaze)時間5年前 (2018/08/14 09:40), 編輯推噓4(4019)
留言23則, 4人參與, 5年前最新討論串1/1
最近剛學到trait的用法,看了php.net和很多教學後已經對他有初步認識 不過還是有一些疑問想要請教... 我假設有一段程式碼是使用trait的,像這樣: trait tFoo { private function foo() { //... } } class Bar1 { use tFoo; public function bar() { $this->foo(); //... } } 而有另外一段有相同作用的程式碼,像這樣: class Foo { //用處與tFoo相同 public function foo() { //... } } class Bar2 { //用處與Bar1相同 private $foo; public function bar() { $this->foo = new Foo(); $this->foo->foo(); //... } } 想請問一下各位大大,以程式維護和易讀性的角度來看,這兩種做法的差別在哪呢? 還是以其他角度來看,有問題是我沒有注意到的呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.238.147.185 ※ 文章網址: https://www.ptt.cc/bbs/PHP/M.1534210845.A.39D.html

08/14 10:02, 5年前 , 1F
trait 視為 class 的語法糖,在運行時不耗額外記憶體
08/14 10:02, 1F

08/14 10:06, 5年前 , 2F
如果要解耦合,還是用 class 的方式會比較好
08/14 10:06, 2F

08/14 11:14, 5年前 , 3F
看過一些專案濫用trait 要借用什麼功能就require/use
08/14 11:14, 3F

08/14 11:15, 5年前 , 4F
造成controller/model/library角色不分 違反MVC原則
08/14 11:15, 4F

08/14 11:17, 5年前 , 5F
除非嚴格遵守各trait間的從屬關係 否則新手最好別用來
08/14 11:17, 5F

08/14 11:17, 5年前 , 6F
偷懶 用起來太爽的工具不利於學習
08/14 11:17, 6F

08/14 19:24, 5年前 , 7F
不用new直接用的class
08/14 19:24, 7F

08/14 19:24, 5年前 , 8F
自己用在權限
08/14 19:24, 8F

08/18 12:47, 5年前 , 9F
trait的實作是copy&paste到該parent底下,實際上可以想
08/18 12:47, 9F

08/18 12:48, 5年前 , 10F
像成「有實作」的interface。比如有一個trait叫作
08/18 12:48, 10F

08/18 12:48, 5年前 , 11F
CanBite,這樣可以給兩種不同的狗使用。而不會因為定義
08/18 12:48, 11F

08/18 12:49, 5年前 , 12F
了一個CanBiteInterface,就強迫兩隻狗都要寫一模一樣
08/18 12:49, 12F

08/18 12:49, 5年前 , 13F
的 bite() 方法。
08/18 12:49, 13F

08/18 12:49, 5年前 , 14F
但要記住,trait 不單單只是「把你的code換另一個檔案放
08/18 12:49, 14F

08/18 12:50, 5年前 , 15F
」「看起來比較乾淨」而已,還要考慮到各類別的職責,
08/18 12:50, 15F

08/18 12:51, 5年前 , 16F
因為複製過來的trait就算是該類別的一部分。如果你做
08/18 12:51, 16F

08/18 12:51, 5年前 , 17F
太多事情,又需要一些屬性,那你還是寫成class會比較
08/18 12:51, 17F

08/18 12:51, 5年前 , 18F
好。
08/18 12:51, 18F

08/18 12:53, 5年前 , 19F
還有,因為你在 Bar2,需要 Foo 這個類別,所以你直接
08/18 12:53, 19F

08/18 12:53, 5年前 , 20F
new 一個 Foo 然後呼叫他的方法,這樣會直接對 Foo 產
08/18 12:53, 20F

08/18 12:53, 5年前 , 21F
生依賴,有 Bar2 的地方就一定要有 Foo,兩個耦合程度
08/18 12:53, 21F

08/18 12:53, 5年前 , 22F
會過高,在設計類別的時候可以思考一下各 class 的職
08/18 12:53, 22F

08/18 12:53, 5年前 , 23F
責,免得容易寫出萬能類別,或是萬能 trait。
08/18 12:53, 23F
文章代碼(AID): #1RSZCTET (PHP)