在设计 Trait 时,我们可以尽可能让每个 Trait 只完成一个功能(单一职责原则),然后通过 Trait 组合的方式灵活构建完成特定任务功能的 Trait,不管是从复杂系统的模块化角度还是从代码复用性、可维护性、可扩展性角度来说,这都是最佳实践。
Trait 和类相似,支持定义方法和属性,但不是类,不支持定义构造函数,因而不能实例化,只能被其他类使用
要在一个类中使用 Trait,可以通过 use
关键字引入,然后就可以在类方法中直接使用 trait 中定义的方法了
由此可见,我们可以轻松通过 Trait + 类的组合扩展类的功能,在某个类中使用了 Trait 之后,就好像把它的所有代码合并到这个类中一样,可以自由调用,并且同一个 Trait 可以被多个类复用,从而突破 PHP 单继承机制的限制,有效提升代码复用性和扩展性。
优先级问题:同名方法重写的优先级依次是:使用 Trait 的类 > Trait > 父类
多个Trait方法重名则会报错
可以手动指定谁的方法更加优先
// Engine中的printText来替代Power中的printText
use Power, Engine {
Engine::printText insteadof Power;
}
也可以通过as来指定别名
use Power, Engine {
Engine::printText insteadof Power;
Power::printText as printPower;
Engine::printText as printEngine;
}
Trait 除了可以被类使用来扩展类功能,还可以组合多个 Trait 构建更复杂的 Trait 实现更强大的功能
trait Component
{
use Power, Engine {
Engine::printText insteadof Power;
Power::printText as printPower;
Engine::printText as printEngine;
}
protected function init()
{
$this->gas();
$this->four();
}
}