[请益] 关于trait的使用

楼主: m2251000 (akakaze 二兵 >)   2018-08-14 09:40:39
最近刚学到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();
//...
}
}
想请问一下各位大大,以程式维护和易读性的角度来看,这两种做法的差别在哪呢?
还是以其他角度来看,有问题是我没有注意到的呢?
作者: MoMoShota (正太控)   2018-08-14 10:02:00
trait 视为 class 的语法糖,在运行时不耗额外内存如果要解耦合,还是用 class 的方式会比较好
作者: MOONRAKER (㊣牛鹤鳗毛人)   2018-08-14 11:14:00
看过一些专案滥用trait 要借用什么功能就require/use造成controller/model/library角色不分 违反MVC原则除非严格遵守各trait间的从属关系 否则新手最好别用来偷懒 用起来太爽的工具不利于学习
作者: molopo (mmm)   2018-08-14 19:24:00
不用new直接用的class自己用在权限
作者: banqhsia (BEN)   2018-08-18 12:47:00
trait的实作是copy&paste到该parent底下,实际上可以想像成“有实作”的interface。比如有一个trait叫作CanBite,这样可以给两种不同的狗使用。而不会因为定义了一个CanBiteInterface,就强迫两只狗都要写一模一样的 bite() 方法。但要记住,trait 不单单只是“把你的code换另一个档案放”“看起来比较干净”而已,还要考虑到各类别的职责,因为复制过来的trait就算是该类别的一部分。如果你做太多事情,又需要一些属性,那你还是写成class会比较好。还有,因为你在 Bar2,需要 Foo 这个类别,所以你直接new 一个 Foo 然后呼叫他的方法,这样会直接对 Foo 产生依赖,有 Bar2 的地方就一定要有 Foo,两个耦合程度会过高,在设计类别的时候可以思考一下各 class 的职责,免得容易写出万能类别,或是万能 trait。

Links booklink

Contact Us: admin [ a t ] ucptt.com