Rumah  >  Artikel  >  pembangunan bahagian belakang  >  什么是Trait?php中Trait的申明和使用技巧分享

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

伊谢尔伦
伊谢尔伦asal
2017-05-17 14:14:291809semak imbas

什么是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实战视频教程

Atas ialah kandungan terperinci 什么是Trait?php中Trait的申明和使用技巧分享. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn