它既不是接口也不是类。主要是为了解决单继承语言的限制。是PHP多重继承的一种解决方案。
可以这么理解:
1、trait 用来复用代码的
2、解决了 php 不能多继承的问题(多继承也会产生问题,这里不展开)
3、使用 trait的类,跟 trait 本身是可以没有任何关系的(与直接继承的区别)
Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制。
当有一个方法需要在很多的类中使用时,该怎么处理?
通常一般的处理方式会是,写一个基础类,在基类中实现这个方法,然后所有类都继承这个基类。
这是一种处理方法,但不是最好的处理方式。通常采用继承的情况是:几个类具有很大的相似性。比如人作为一个基类,学生、工人、等继承“人”这个基类来扩展。
由此,trait的作用就出来了,trait 可以在多个类中使用。
<?php
trait HelloWorld {
public function sayHello() {
echo ‘Hello World!‘;
}
}
class TheWorldIsNotEnough {
use HelloWorld;
public function sayHello() {
echo ‘Hello Universe!‘;
}
}
$o = new TheWorldIsNotEnough();
$o->sayHello(); // 输出是 Hello Universe!