博客列表 >Trait的五种应用场景

Trait的五种应用场景

Dong.
Dong.原创
2020年07月27日 17:46:19866浏览

声明:

Tirait特性:
方法集合,临时类,类中类,可以嵌套到宿主类
拥有三种成员:1.常规成员,2.静态成员,3.抽象成员(没有属性)
优先级:自身方法 > trait的方法 > 继承的方法

1.Trait功能:代码复用

  1. <?php
  2. //代码复用
  3. // 在trait类中定义方法,在不同类中调用
  4. trait tDemo
  5. {
  6. public function show($name,$age,$like)
  7. {
  8. printf('Hello,大家好,我叫%s,今年%s,%s。',$name,$age,$like);
  9. }}
  10. class User1
  11. {
  12. use tDemo;
  13. protected $name = '王强';
  14. protected $age = 19;
  15. protected $like ='爱打篮球';
  16. public function introduce(){
  17. return $this->show($this->name,$this->age,$this->like);
  18. }}
  19. class User2
  20. {
  21. use tDemo;
  22. protected $name = '李娟';
  23. protected $age = 20;
  24. protected $like ='爱跳舞';
  25. public function introduce()
  26. {
  27. return $this->show($this->name,$this->age,$this->like);
  28. }}
  29. class User3
  30. {
  31. use tDemo;
  32. protected $name = '兰兰';
  33. protected $age = 19;
  34. protected $like ='爱画画';
  35. public function introduce()
  36. {
  37. return $this->show($this->name,$this->age,$this->like);
  38. }}
  39. (new User1)->introduce();
  40. echo '<hr>';
  41. (new User2)->introduce();
  42. echo '<hr>';
  43. (new User3)->introduce();

输出结果:


2.Trait功能:在继承上下文中的应用

  1. <?php
  2. //在继承上下文中的应用
  3. trait Demo
  4. {
  5. public static function way()
  6. {
  7. return 'trait中的方法' . __METHOD__;
  8. }}
  9. // 父类/超类/基类
  10. class Father
  11. {
  12. use Demo;
  13. public static function way()
  14. {
  15. return '基类中的方法' . __METHOD__;
  16. }}
  17. // 子类/扩展类
  18. class Son extends Father
  19. {
  20. use Demo;
  21. public static function way()
  22. {
  23. return '子类中的方法' . __METHOD__;
  24. }}
  25. //子类同名成员优先级大于父级同名成员
  26. //子类>trait>父类
  27. echo son::way();

输出结果:


3.Trait功能:实现功能扩展

  1. <?php
  2. //扩展类功能的扩展
  3. trait tDemo1
  4. {
  5. // 打印所有属性(公共方法)
  6. public function getProps()
  7. {
  8. printf('%s', print_r(get_class_vars(__CLASS__), true));
  9. }}
  10. trait tDemo2
  11. {
  12. // 打印所有方法(公共方法)
  13. public function getMethods()
  14. {
  15. printf('%s', print_r(get_class_methods(__CLASS__), true));
  16. }}
  17. trait tDemo3
  18. {
  19. use tDemo1, tDemo2;
  20. }
  21. class Demo1
  22. {
  23. use tDemo1, tDemo2; //可引用多个trait实现功能扩展
  24. protected $name = '李军';
  25. protected $gender = '男';
  26. public function show()
  27. {
  28. return $this -> getProps();
  29. }}
  30. class Demo2
  31. {
  32. use tDemo3; //tDemo3引入了tDemo1、tDemo2,此时只引入一个trait就可以
  33. protected $name = '张丹';
  34. protected $gender = '女';
  35. public function show()
  36. {
  37. return $this -> getProps();
  38. }}
  39. echo 'Demo1' . "<br>";
  40. echo '类属性:', (new Demo1)->getProps() . "<br>";
  41. echo '类方法:', (new Demo1)->getMethods();
  42. echo '<hr>';
  43. echo 'Demo2' . "<br>";
  44. echo '类属性:', (new Demo2)->getProps() . "<br>";
  45. echo '类方法:', (new Demo2)->getMethods();

输出结果:


4.在Trait组合中命名冲突的解决方案

  1. <?php
  2. //在trait组合中命名冲突的解决方案
  3. trait Demo1
  4. {
  5. public function show()
  6. {
  7. return '我是:'.__METHOD__;
  8. }
  9. }
  10. trait Demo2
  11. {
  12. public function show()
  13. {
  14. return '我是:'.__METHOD__;
  15. }
  16. }
  17. trait Demo3
  18. {
  19. use Demo1, Demo2 {
  20. // 给Demo2::show()起个别名: tb2
  21. Demo2::show as tb2;
  22. // 调用Demo1::show()替换成Demo2::show()
  23. Demo1::show insteadOf Demo2;
  24. }
  25. }
  26. // 工作类尽可能写得代码清晰,简洁
  27. class Demo
  28. {
  29. use Demo3;
  30. }
  31. echo (new Demo)->show();
  32. echo '
  33. ';
  34. // 别名访问Demo2::show
  35. echo (new Demo)->tb2();

输出结果:

5.Trait和interface的组合

  1. <?php
  2. //trait和interface的组合
  3. // 接口
  4. interface iDemo
  5. {
  6. public static function index();
  7. }
  8. // trait
  9. trait tDemo
  10. {
  11. // 将接口中的抽象方法的实现过程放在trait中实现,并在工作类中调用
  12. public static function index()
  13. {
  14. return __METHOD__;
  15. }}
  16. // 实现类
  17. class Hello implements iDemo
  18. {
  19. use tDemo;
  20. }
  21. // 客户端
  22. echo Hello::index();

输出结果:

总结:

  • 不同与继承,类中使用user关键字引入trait成员
  • 在宿主中还必须把trait中的抽象方法实现
  • trait中的方法和成员看成类方法和成员
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议