摘一段官方的注释:
自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。
Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。
上边的解释已经很明显了,个人理解就是,自己写了一个类,里边有很多方法(这里就可以任意发挥了,比方说是数据库操作转换类,在查询出数据库数据库可能有很多种mysql、mongo、redis、es之后统一的增加一些方法)然后在需要使用的地方use一下,相当于require了一个文件文件里边有很多方法,并且可以读区当前class里边的任意数据,是不是很方便操作东西了呢
单实际怎么去用呢这就很简单了,注意定义的局部方法和局部变量,哪怕是类级别的变量都可以直接使用,理解为merge了一些
重复的方法和属性,
如果有多个需要引用的trait
use Cat, Dog { Cat::eat insteadof Dog; // 此处代表使用cat中的eat代替dog中的eat Cat::sleep insteadof Dog; // 此处代表使用cat中的eat代替dog中的eat Dog::eat as DogEat; // 或者使用as使用别名 Dog::sleep as public DogSleep; // 这里还可以更改复制出来的方法的访问权限,注意不影响traid里边的原始方法权限 }
请注意,7.0版本之后重复的属性可以定义,但是他的访问权限和值在定义的时候必须相等
trait Cat { public function eat() { echo $this->name . '家的猫咪在吃饭' . PHP_EOL; } protected function sleep() { echo $this->name . "家的猫咪在睡觉" . PHP_EOL; } } trait Dog { public function eat() { echo $this->name . '家的狗狗在吃饭' . PHP_EOL; } protected function sleep() { echo $this->name . "家的狗狗在睡觉" . PHP_EOL; } } class Student { use Cat, Dog { Cat::eat insteadof Dog; // 此处代表使用cat中的eat代替dog中的eat Cat::sleep insteadof Dog; // 此处代表使用cat中的eat代替dog中的eat Dog::eat as DogEat; // 或者使用as使用别名 Dog::sleep as public DogSleep; // 这里还可以更改复制出来的方法的访问权限,注意不影响traid里边的原始方法权限 } public $name = "张三"; } $student = new Student(); $student->DogEat(); $student->DogSleep();