作者m2251000 (akakaze)
看板PHP
标题[请益] 关於trait的使用
时间Tue Aug 14 09:40:39 2018
最近刚学到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://webptt.com/cn.aspx?n=bbs/PHP/M.1534210845.A.39D.html
1F:推 MoMoShota: trait 视为 class 的语法糖,在运行时不耗额外记忆体 08/14 10:02
2F:→ MoMoShota: 如果要解耦合,还是用 class 的方式会比较好 08/14 10:06
3F:→ MOONRAKER: 看过一些专案滥用trait 要借用什麽功能就require/use 08/14 11:14
4F:→ MOONRAKER: 造成controller/model/library角色不分 违反MVC原则 08/14 11:15
5F:→ MOONRAKER: 除非严格遵守各trait间的从属关系 否则新手最好别用来 08/14 11:17
6F:→ MOONRAKER: 偷懒 用起来太爽的工具不利於学习 08/14 11:17
7F:推 molopo: 不用new直接用的class 08/14 19:24
8F:→ molopo: 自己用在权限 08/14 19:24
9F:推 banqhsia: trait的实作是copy&paste到该parent底下,实际上可以想 08/18 12:47
10F:→ banqhsia: 像成「有实作」的interface。比如有一个trait叫作 08/18 12:48
11F:→ banqhsia: CanBite,这样可以给两种不同的狗使用。而不会因为定义 08/18 12:48
12F:→ banqhsia: 了一个CanBiteInterface,就强迫两只狗都要写一模一样 08/18 12:49
13F:→ banqhsia: 的 bite() 方法。 08/18 12:49
14F:→ banqhsia: 但要记住,trait 不单单只是「把你的code换另一个档案放 08/18 12:49
15F:→ banqhsia: 」「看起来比较乾净」而已,还要考虑到各类别的职责, 08/18 12:50
16F:→ banqhsia: 因为复制过来的trait就算是该类别的一部分。如果你做 08/18 12:51
17F:→ banqhsia: 太多事情,又需要一些属性,那你还是写成class会比较 08/18 12:51
18F:→ banqhsia: 好。 08/18 12:51
19F:推 banqhsia: 还有,因为你在 Bar2,需要 Foo 这个类别,所以你直接 08/18 12:53
20F:→ banqhsia: new 一个 Foo 然後呼叫他的方法,这样会直接对 Foo 产 08/18 12:53
21F:→ banqhsia: 生依赖,有 Bar2 的地方就一定要有 Foo,两个耦合程度 08/18 12:53
22F:→ banqhsia: 会过高,在设计类别的时候可以思考一下各 class 的职 08/18 12:53
23F:→ banqhsia: 责,免得容易写出万能类别,或是万能 trait。 08/18 12:53