什么是trait
Trait是为类似PHP的单继承语言而准备的一种代码复用机制。Trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用method。
Trait是PHP5.4.0起引入,它既像类又像接口。trait是类的部分实现,可以混入一个或多个现有的PHP类中。
Trait有两个作用:表明类可以做什么(像是接口);提供模块化实现(像是类)。
为什么使用trait
PHP语言使用的是单继承模型,大多数时候,这种继承模型能良好运作。可是,如果想让两个无关的PHP类具有类似的行为,应该怎么做呢?
Trait就是为了解决这种问题而诞生的。Trait能把模块化的实现方式注入多个无关的类中,而且trait还能促进代码重用。
如何创建trait
PHP中trait的定义方式如下:
<?phptrait MyTrait{ //这里是trait的实现}
建议:建议与定义类和接口一样,一个文件只定义一个trait,这是良好实践。
trait的5种使用方法
1、简单使用
<?phptrait first_trait{ function first_method() {/*code here*/} function second_method() {/*code here*/}}class first_class{//声明使用first_trait,用use关键字 use first_trait;}$obj = new first_class();$obj->first_method();$obj->second_method();
2、使用多个trait
<?phptrait first_trait{ function first_method() {/*code here*/}}trait second_trait{ function second_method() {/*code here*/}}class first_class{//多个trait之间用逗号分隔 use first_trait,second_trait;}$obj = new first_class();$obj->first_method();$obj->second_method();
3、trait之间的嵌套
<?phptrait first_trait{ function first_method() {/*code here*/}}trait second_trait{ use first_trait; function second_method() {/*code here*/}}class first_class{ use second_trait;}$obj = new first_class();$obj->first_method();$obj->second_method();
4、trait的抽象方法
在trait中声明需要实现的抽象方法,这样能使使用它的Class必须实现它
<?phptrait first_trait{ function first_method() {/*code here*/} abstract public function second_method();}class first_class{ use first_trait; function second_method() {/*code here*/}}
5、trait之间的冲突
多个Trait之间的冲突,可以使用insteadof操作符来明确指定使用冲突方法中的哪一个;还可以用as操作符将其中一个冲突的方法以另一个名称引入
<?phptrait first_trait{ function first_function() { echo "From Frist Trait";}}trait second_trait{ function first_function() { echo "From Second Trait";}}class first_class{ use first_trait,second_trait{ first_trait::first_function insteadof second_trait; second_trait::first_function as second_function;}}$obj = new first_class();$obj->first_function(); //输出:From Frist Trait$obj->second_function(); //输出:From Second Trait
好了,trait的用法你已经完全掌握了,是不是完美的实现了多继承的功能呢,赶紧用起来吧。