Blogger Information
Blog 119
fans 3
comment 1
visits 94677
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
Trait基础与Trait与接口、抽象类相接合实例
赵大叔
Original
791 people have browsed it

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>';

效果图:

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:非常认真, 一路学过来, 不容易
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post