博主信息
博文 26
粉丝 0
评论 0
访问量 28535
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
trait 与接口,抽象类实战
溪边小树
原创
907人浏览过

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 与接口,抽象类实战案例,完成了一个水果店赠送抽奖活动,除了水果名称之外,还加上了重量,加了点小改进。当然实例还可以再优化完善,实现“大转盘”等更直观、更具体验感的展示方式,留待后续提升练习。

批改老师:天蓬老师天蓬老师

批改状态:合格

老师批语:终于可以做点小东西了, 是不是有点小激动
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学