什么是Trait?
php 从 5.4版本起开始支持 Trait 特性,和 Class 类很相似,类中一般的特性 Trait 都可以实现。Trait 不是用来替代类的,而是要去 “ 混入” 类中。 Trait 是为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。 Trait 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承相关的典型问题。例如,需要同时继承两个抽象类,这是php语言不支持的功能, Trait 就是为了解决这个问题。或者可以理解为在继承类链中隔离了子类继承父类的某些特性,相当于要用父类的特性的时候,如果有 Trait 就优先调用 Trait 的成员。
Trait 的声明
声明类需要使用 class 关键字,声明 Trait 当然也要使用 trait 关键字了, 类有的特性 Trait 一般都有。 Trait 支持 final、static 和 abstract 等修饰词,所以 Trait 也就支持抽象方法的使用、类定义静态方法,当然也可以定义属性。但 Trait 无法如类一样使用 new 实例化,因为 Trait 就是用来混入类中使用的,不能单独使用。如果拿 Interface 和 Trait 类比, Trait 会有更多方便的地方。
简单的 Trait 的声明代码如下所示:
<?php //使用 trait 关键字申明一个 Trait,需要php5.4以上的版本 trait dome{ public $a = true; //声明成员属性 static $b = 1; //使用 static 关键字声明静态变量 function method1(){ } //声明成员方法 abstract public function method2(); //加入抽象修饰符,说明调用类必须实现它 } ?>
Trait 的基本使用
和类不同的是, Trait 不能通过它自身来实例化对象,必须将其混入类中使用。相当于将 Trait 中的成员复制到类中,在应用类时就像使用自己的成员一样。如果要在类中使用 Trait 。需要通过 use 关键字将 Trait 混入类中。
其代码如下所示:
<?php //使用 trait 关键字申明一个 Trait,有两个成员方法 trait dome{ function method1(){ } //声明成员方法 function method2(){ } //声明成员方法 } class dome1{ //申明一个类,类中混入 Trait use dome; //使用 use 关键字在类中使用 dome } $obj = new dome1(); //实例化 dome1 对象 $obj->method1(); // 通过 dome1 对象,直接调用混入类 dome1 的成员方法 method1 $obj->method2(); // 通过 dome1 对象,直接调用混入类 dome1 的成员方法 method2 ?>
上例中通过 use 关键字,在dome1 类中混入 dome 中的成员。也可以通过 use 关键字一次混入多个 Trait 一起使用。通过逗号分割,在 use 声明列出多个 Trait ,可以都插入到一个类中。需要注意的是,多个 Trait 之间同时使用难免会发生冲突。 php5.4 从语法方面带入了相关的关键字语法 insteadof 。
示例代码如下所示:
<?php //使用 trait 关键字申明一个 Trait,有两个成员方法 trait dome1 { function fun() { echo "第一个 Trait 中的 fun 方法"; } } trait dome2 //这里名称相同就会有冲突 { function fun() { echo "第二个 Trait 中的 fun 方法"; } } class dome{ use dome1,dome2{ // dome2 中申明 dome1::fun insteadof dome2; // 申明使用 dome1 中的 fun 替换 } } $obj = new dome(); $obj->fun(); // 输出第一个 Trait 中的 fun 方法 ?>
不仅可以在类中使用 use 关键字将 Trait 中的成员混入类中,也可以在 Trait 中使用 use 关键字将另一个 Trait 中的成员混入进来。这样就形成了 Trait 之间的嵌套。为了对使用的类施加强制要求, Trait 支持抽象方法的使用。如果在 Trait 中申明需要实现的抽象方法,这样就能使使用它的类必须先实现它,就像继承抽象类,必须实现类中的抽象方法一样。
更详细的使用方式可以参考官方手册。但刚开始学习 Trait 应该了解如下的重点:
1. Trait 会覆盖调用类的父类方法。
2. 从基类继承的成员被 Trait 插入的成员所覆盖。优先顺序是:来自当前类的成员覆盖了 Trait 的方法,而 Trait 则覆盖了被继承的方法。
3. Trait 不能像类一样使用 new 实例化对象。
4. 单个 Trait 可由多个 Trait 组成。
5. 在单个类中,用 use 引入 Trait ,可以引入多个。
6. Trait 支持修饰词,例如 final、static、abstract。
7. 可以使用 insteadof 及 as 操作符解决 Trait之间的冲突。
8. 使用 as 语法还可以用来调整方法的访问控制。
【相关教程推荐】
2. 视频教程:trait特性的声明与使用技巧:实现代码复用的类方法集合
3. php实战视频教程
以上是什么是Trait?php中Trait的申明和使用技巧分享的详细内容。更多信息请关注PHP中文网其他相关文章!