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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 4
Summer

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

7年前 评论

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

7年前 评论

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

7年前 评论

根据需求来选择

7年前 评论

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