在设计 Trait 时,我们可以尽可能让每个 Trait 只完成一个功能(单一职责原则),然后通过 Trait 组合的方式灵活构建完成特定任务功能的 Trait,不管是从复杂系统的模块化角度还是从代码复用性、可维护性、可扩展性角度来说,这都是最佳实践。

    Trait 和类相似,支持定义方法和属性,但不是类,不支持定义构造函数,因而不能实例化,只能被其他类使用

    要在一个类中使用 Trait,可以通过 use 关键字引入,然后就可以在类方法中直接使用 trait 中定义的方法了

    由此可见,我们可以轻松通过 Trait + 类的组合扩展类的功能,在某个类中使用了 Trait 之后,就好像把它的所有代码合并到这个类中一样,可以自由调用,并且同一个 Trait 可以被多个类复用,从而突破 PHP 单继承机制的限制,有效提升代码复用性和扩展性。

    优先级问题:同名方法重写的优先级依次是:使用 Trait 的类 > Trait > 父类

    多个Trait方法重名则会报错
    可以手动指定谁的方法更加优先

    1. // Engine中的printText来替代Power中的printText
    2. use Power, Engine {
    3. Engine::printText insteadof Power;
    4. }

    也可以通过as来指定别名

    1. use Power, Engine {
    2. Engine::printText insteadof Power;
    3. Power::printText as printPower;
    4. Engine::printText as printEngine;
    5. }

    Trait 除了可以被类使用来扩展类功能,还可以组合多个 Trait 构建更复杂的 Trait 实现更强大的功能

    1. trait Component
    2. {
    3. use Power, Engine {
    4. Engine::printText insteadof Power;
    5. Power::printText as printPower;
    6. Engine::printText as printEngine;
    7. }
    8. protected function init()
    9. {
    10. $this->gas();
    11. $this->four();
    12. }
    13. }