Trait 是把双刃剑吗?
Trait
在我理解是一个不能实例化的class,用于实现多继承的关系。先说说它常见的使用场景。
假设我们有两个类:
Bird(鸟),Superman(超人)。他们有一样的属性 name
,一样的方法 fly()
,这样我们就可以把这些公共的部分写成一个Trait来复用。
<?php
trait CanFly {
public $name;
public function fly() {
echo "I can Fly";
}
}
class Bird {
use CanFly;
......
}
class Superman {
use CanFly;
......
}
当然我们不用 Trait
也能实现。给Bird,Superman建立一个父类,父类实现 name
属性和 fly()
方法。可能有人会说,用 Trait
看起来会清晰一些,少一层继承关系。那看看下面的写法是不是也可以呢。
<?php
class CanFly {
public $name;
public function fly() {
echo "I can Fly";
}
}
class Bird {
public $canfly;
public function __construct() {
$this->canfly = new CanFly();
}
}
class Superman {
public $canfly;
public function __construct() {
$this->canfly = new CanFly();
}
}
为什么我会说 Trait
可能是把双刃剑呢?因为下层可能无法得知上层都use了哪些 Trait
,并且 Trait
可以互相继承 class
也可以互相继承,最后的关系可能会异常复杂。所以我还是觉得单一继承,会使问题更简单一些。不知道大家是什么看法呢?
所以要『合理』灵活地『应用』 :smile_cat:
两种都体现的组合的概念,但是感觉trait更灵活方便一点,蛮有趣的话题,人工帮顶
组合对象时候,必须要一个完整概念的对象,使用trait可以组合更细粒度的缺损概念,
根据需求来选择