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 也可以互相继承,最后的关系可能会异常复杂。所以我还是觉得单一继承,会使问题更简单一些。不知道大家是什么看法呢?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 4
Summer

所以要『合理』灵活地『应用』 :smile_cat:

6年前 评论

两种都体现的组合的概念,但是感觉trait更灵活方便一点,蛮有趣的话题,人工帮顶

6年前 评论

组合对象时候,必须要一个完整概念的对象,使用trait可以组合更细粒度的缺损概念,

6年前 评论

根据需求来选择

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!