博客列表 >Trait基础与Trait与接口、抽象类相接合实例

Trait基础与Trait与接口、抽象类相接合实例

赵大叔
赵大叔原创
2020年05月03日 20:41:48788浏览

Trait

Trait基础知识

命名冲突解决办法:1.insteadOf重命名; 2. as别名
在trait中改变trait成员的访问控制as

演示Trait命名冲突的解决和改变trait成员的访问控制:

  1. <?php
  2. // 解决trait组合中的方法命名冲突
  3. trait tDemo1
  4. {
  5. public function show()
  6. {
  7. echo 'trait: tDemo1; 方法: show';
  8. }
  9. }
  10. trait tDemo2
  11. {
  12. public function show()
  13. {
  14. echo 'trait: tDemo2; 方法: show';
  15. }
  16. }
  17. // 创建一个trait引用上面两个trait
  18. trait tDemo3
  19. {
  20. use tDemo1, tDemo2 {
  21. // 1. 替代: 没有了
  22. tDemo1::show insteadOf tDemo2;
  23. // 2. 别名: 换个名字,两个都还在
  24. tDemo2::show as showtd2;
  25. }
  26. // as: 修改trait成员的访问控制
  27. use tDemo1 {show as protected showtd1;}
  28. }
  29. // 工作类
  30. class Lamviec
  31. {
  32. use tDemo3;
  33. }
  34. // 客户端
  35. $lamviec = new Lamviec();
  36. // 调用的是tDemo1的方法
  37. $lamviec->show();
  38. echo '<hr>';
  39. // 调用的是tDemo1的方法
  40. $lamviec->showtd2();
  41. echo '<hr>';
  42. // 修改tDemo1中方法的访问控制,后不能访问
  43. // echo $lamviec->showtd1();

效果图:

trait 实现接口方法的优缺点

1. trait优点

间接实现类的横向多继承;可以先把接口中的方法分开trai中实现,然后同时引用多个trait,方便调用,方便维护。

2. trait缺点

在trait中实现接口方法不能调用抽象类中已经实现过的方法。(如我案例中,想在trait中使用$base

实例演示trait与接口、抽象类相接合编程

  1. <?php
  2. // 在接口中声明4个接口方法
  3. interface iMeritpay
  4. {
  5. public function base(int $coban, int $hieuq, int $chucv);
  6. public function vanphong (float $diem, int $base);
  7. public function sanxuat (float $diemcanhan, float $diemxuong, int $base);
  8. public function xuong (float $diem, int $base);
  9. }
  10. // 抽象类实现base()接口方法
  11. abstract class aBase implements iMeritpay
  12. {
  13. public function base(int $coban, int $hieuq, int $chucv)
  14. {
  15. return $coban + $hieuq + $chucv;
  16. }
  17. }
  18. // 在trait中实现接口的方法
  19. trait tVanphong
  20. {
  21. public function vanphong (float $diem, int $base)
  22. {
  23. return (($diem-100)/100) * $base * 0.6;
  24. }
  25. }
  26. trait tSanxuat
  27. {
  28. public function sanxuat (float $diemcanhan, float $diemxuong, int $base)
  29. {
  30. return ((($diemcanhan * 0.5 + $diemxuong * 0.5)-100) / 100) * $base * 0.8;
  31. }
  32. }
  33. trait tXuong
  34. {
  35. public function xuong (float $diem, int $base)
  36. {
  37. return (($diem-100)/100) * $base;
  38. }
  39. }
  40. // 声明一个大的trait引入上面的三个小trait
  41. trait tCachtinh
  42. {
  43. use tVanphong, tSanxuat, tXuong;
  44. }
  45. // 创建工作类引入trait,就不用再实现接口方法
  46. class Tinhra extends aBase
  47. {
  48. use tCachtinh;
  49. }
  50. // 客户端调用
  51. $tinhra = new Tinhra;
  52. $base = $tinhra->base(510, 210, 200);
  53. // 计算vanphong
  54. echo $tinhra->vanphong(116.8, $base) .'<hr>';
  55. // 计算sanxuat
  56. echo $tinhra->sanxuat(116.8, 120.31, $base) .'<hr>';
  57. // 计算xuong
  58. echo $tinhra->xuong(116.8, $base) .'<hr>';

效果图:

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议