欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

什么是Trait?php中Trait的申明和使用技巧分享

程序员文章站 2022-05-21 13:03:43
...
什么是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的申明和使用技巧分享的详细内容,更多请关注其它相关文章!