Blogger Information
Blog 26
fans 0
comment 0
visits 21810
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
trait 与接口,抽象类实战
溪边小树
Original
745 people have browsed it

1、Trait组合的同名方法的命名冲突的解决方案:一是替换,用关键字insteadOf,二是别名,用关键字as,as 还可以修改trait成员的访问控制,两种命名冲突的解决方案和trait中改变trait中的访问控制的方法演示如下:

  1. <?php
  2. // trait功能3: trait组合实现功能扩展
  3. trait tTest1
  4. {
  5. // 格式化打印类中属性
  6. public function getProps()
  7. {
  8. $props =get_class_vars(__CLASS__);
  9. printf('<pre>%s</pre>', print_r($props, true));
  10. }
  11. }
  12. trait tTest2
  13. {
  14. // 格式化打印类中方法
  15. public function getMethods()
  16. {
  17. $props =get_class_methods(__CLASS__);
  18. printf('<pre>%s</pre>', print_r($props, true));
  19. }
  20. }
  21. // 工作类
  22. class Work1
  23. {
  24. // 引用多个trait, 中间用逗号分开
  25. use tTest1, tTest2;
  26. public $course = '编程';
  27. public $score = 90;
  28. protected function tablelists()
  29. {
  30. return $this->course . ' : ' . $this->score;
  31. }
  32. }
  33. // 客户端
  34. $work1 = new Work1();
  35. $work1->getProps();
  36. $work1->getMethods();
  37. //////////////////////////////////////////////////
  38. trait tTest3
  39. {
  40. // 引用多个trait, 中间用逗号分开
  41. use tTest1, tTest2;
  42. }
  43. // 工作类
  44. class Work2
  45. {
  46. // 只要引用一个trait组合
  47. use tTest3;
  48. public $course = '编程';
  49. public $score = 66;
  50. protected function tablelists()
  51. {
  52. return $this->course . ' : ' . $this->score;
  53. }
  54. }
  55. // 客户端
  56. $work2 = new Work2();
  57. $work2->getProps();
  58. $work2->getMethods();
  59. // trait4: 解决trait组合中的方法命名冲突
  60. trait tceshi1
  61. {
  62. public function display()
  63. {
  64. return __TRAIT__ . ' => ' . __METHOD__;
  65. }
  66. }
  67. trait tceshi2
  68. {
  69. public function display()
  70. {
  71. return __TRAIT__ . ' => ' . __METHOD__;
  72. }
  73. }
  74. trait tceshi3
  75. {
  76. use tceshi1, tceshi2 {
  77. // 1. 替代
  78. tceshi1::display insteadOf tceshi2;
  79. // 2. 别名
  80. tceshi2::display as td2;
  81. }
  82. // as: 还可以修改trait成员的访问控制
  83. use tceshi1 {display as protected td1;}
  84. }
  85. // 工作类
  86. class Work
  87. {
  88. use tceshi3;
  89. }
  90. // 客户端
  91. $work = new Work();
  92. echo $work->display();
  93. echo '<hr>';
  94. echo $work->td2();
  95. echo '<hr>';
  96. echo $work->td1();

2、个人感觉trait 实现接口的方法优点是可以方便不同用户对方法的调用,更好得实现代码复用;缺点可能是在trait中实现了接口的方法,如果功能不能很好的满足用户类的需求,则在类中需要重写,增加了工作量。

3、实例演示一个trait与接口,抽象类联合编程:

  1. <?php
  2. //水果篮
  3. $fruits = ['苹果', '提子', '香蕉', '菠萝', '樱桃', '芒果', '油桃', '西瓜'];
  4. // 接口
  5. interface iCreateId
  6. {
  7. // 生成唯一ID
  8. public static function generateId(int $min, int $max):int;
  9. }
  10. // trait: 实现接口方法
  11. trait createId
  12. {
  13. public static function generateId(int $min, int $max):int
  14. {
  15. return mt_rand($min, $max);
  16. }
  17. }
  18. // 开奖类
  19. class DrawPrize implements iCreateId
  20. {
  21. use createId;
  22. public static function award(array $fruits, int $id)
  23. {
  24. return $fruits[$id];
  25. }
  26. }
  27. // 客户端测试
  28. //print_r($prizes);
  29. printf('<pre>水果篮:<br>%s</pre>', print_r($fruits, true));
  30. echo '<hr>';
  31. $id = DrawPrize::generateId(0,7);
  32. $fruits = DrawPrize::award($fruits, $id);
  33. printf('恭喜您抽到的赠送水果是: <span style="color:red">%s</span><span style="color:blue">%s斤</span>', $fruits,mt_rand(1, 8));

课程学习小结

本次课程老师从浅显易懂的实例出发,细致讲解了接口、trait及抽象类使用的相关内容,通过回看视频及讲义代码,加深了理解, 并通过修改实现trait 与接口,抽象类实战案例,完成了一个水果店赠送抽奖活动,除了水果名称之外,还加上了重量,加了点小改进。当然实例还可以再优化完善,实现“大转盘”等更直观、更具体验感的展示方式,留待后续提升练习。

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