博主信息
博文 119
粉丝 3
评论 1
访问量 121256
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
Trait基础与Trait与接口、抽象类相接合实例
赵大叔
原创
1002人浏览过

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举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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

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