什么是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 语法还可以用来调整方法的访问控制。


【相关教程推荐】

1. 《php.cn独孤九贱(4)-php视频教程

2. 视频教程:trait特性的声明与使用技巧:实现代码复用的类方法集合

3. php实战视频教程

以上就是什么是Trait?php中Trait的申明和使用技巧分享的详细内容,更多请关注Work网其它相关文章!

09-15 19:44