定义 : 为类似PHP的单继承语言准备的一种代码复用机制

    • 可以被类引入,被提供公共代码让共性类引入,让某些不同类型的类具有公共的方法
    • trait结构类似于类 : 有属性和方法(包含抽象方法),不能有类常量
    • 一个类可以引用多个trait


      trait同名 :

    • 属性同名 : 不允许出现

    • 方法同名 :
      • 不允许同名,使用替代方案,确定要使用哪个

    use trait1,trait2{
    trait1::方法名 insteadof trait2;
    }

    • 允许同名,先声明一个trait可以使用,其他的使用别名

    use trait1,trait2{
    trait1::方法名 insteadof trait2;
    trait2::方法名 as 别名;
    }
    trait控制权 :

    • 可以使用as直接修改权限

    use trait{
    方法名 as 访问修饰符;
    }

    • 可以使用起别名的方式修改控制权,原名仍可使用,并且权限和之前相同

    use trait{
    方法名 as 访问修饰符 别名;
    }

    trait优先级: 在引入的过程中可能存在类本身或者父类拥有同名的成员

    • 同名方法系统认定为重写,优先级为 : 子类 > trait >父类
    • 子类父类和trait有同名方法时,子类使用parent访问到的是父类的的方法
      1. <?php
      2. class person{
      3. public $name;
      4. public $age;
      5. public function __construct($name,$age)
      6. {
      7. $this->name=$name;
      8. $this->age=$age;
      9. }
      10. public function play($game)
      11. {
      12. return $this->name."玩{$game}";
      13. }
      14. }
      15. // 定义trait
      16. trait work{
      17. public function make($name)
      18. {
      19. return "我在工作,工作内容是: {$name}";
      20. }
      21. }
      22. trait sleep{
      23. public function shui($time)
      24. {
      25. return "每天睡觉{$time}小时";
      26. }
      27. public function make($hour)
      28. {
      29. return "每天晚上{$hour}点睡觉";
      30. }
      31. public function play($name)
      32. {
      33. return "晚上睡不着觉,偷偷摸摸玩{$name}";
      34. }
      35. }
      36. // 子类
      37. class son extends person{
      38. // 子类中 使用trait 多个使用逗号连接
      39. // 多个trait中拥有同名方法 产生冲突
      40. use work,sleep{
      41. // insteadof 而不是
      42. // 使用work的make方法 而不是sleep的
      43. work::make insteadof sleep;
      44. // 给其他同名方法起别名
      45. sleep::make as make2;
      46. }
      47. public function play($name)
      48. {
      49. return "我是孩子,在家里玩{$name}";
      50. }
      51. }
      52. $li=new son("李四",20);
      53. echo $li->make("敲代码"); // 来自于work
      54. echo "<br>";
      55. // 父类+子类+trait中拥有同名方法时
      56. // 优先级别 子类 > trait > 父类
      57. echo $li->play("泥巴"); // 继承于父类
      58. echo "<br>";
      59. echo $li->shui(12); // 来自于sleep
      60. echo "<br>";
      61. echo $li->make2(11); // 来自于sleep 使用别名调用