博主信息
博文 8
粉丝 0
评论 3
访问量 11019
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
演示Trait组合解决命名冲突和修改Trait访问控制,以及Trait和接口与抽象类混合使用
程东旭
原创
1446人浏览过

Trait组合的同名方法的命名冲突的解决方案有哪些, 实例进行演示

演示如何在trait中改变trait成中的访问控制

代码部分

  1. <?php
  2. //1.先写2个trait,使2个trait中有又相同的方法aaa
  3. trait Demo1
  4. {
  5. public function aaa()
  6. {
  7. return __TRAIT__ . '***' . __METHOD__;
  8. }
  9. }
  10. trait Demo2
  11. {
  12. public function aaa()
  13. {
  14. return __TRAIT__ . '---' . __METHOD__;
  15. }
  16. protected function nnn()
  17. {
  18. return __TRAIT__ . '+++' . __METHOD__;
  19. }
  20. }
  21. //1.替代,用Demo1中的aaa替换Demo2中的aaa
  22. class Demo3
  23. {
  24. use Demo1, Demo2{
  25. Demo1::aaa insteadof Demo2;
  26. }
  27. }
  28. $demo = new Demo3;
  29. echo $demo->aaa() , '<hr>';
  30. //2.别名,把Demo2中的aaa取一个别名,客户端访问别名
  31. //使用这种方法也必须用第一个Demo1中的aaa替代Demo2中的aaa,否则会出错
  32. class Demo4
  33. {
  34. use Demo1, Demo2{
  35. Demo1::aaa insteadof Demo2;
  36. Demo2::aaa as bbb;
  37. }
  38. }
  39. $demo = new Demo4;
  40. echo $demo->bbb() , '<hr>';
  41. //3.用as修改trait中成员的访问控制
  42. //把Demo2种的受保护的aaa修改成为公共的的访问属性
  43. //用use+as修改trait中的成员的访问控制的时候必须要修改发放的名称
  44. class Demo5
  45. {
  46. use Demo2{
  47. nnn as public vvv;
  48. }
  49. }
  50. $demo = new Demo5;
  51. echo $demo->vvv() , '<hr>';

总结

1、当use引用多个trait的时候,如果被引用的不同的trait中存在相同的方法名称,需要用insteadof进行替代,保留其中一个,如果被替代掉的方法也想使用,需要用as来修改被替代掉方法的别名

2、use+as不仅仅可以替换方法名称,而且可以修改该方法的访问控制,但是在修改该方法的访问控制的时候必须同时修改方法名称,修改后的方法名称不能与修改前的方法名称一致

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

代码部分

  1. <?php
  2. //1.先建立一个接口
  3. //先判断当天脚本中有没有要建立的接口名称,如果没有再建立
  4. if (!interface_exists('iUser')){
  5. interface iUser
  6. {
  7. public function user();
  8. }
  9. }
  10. //2.再建立一个抽象类
  11. if (!class_exists('user1')){
  12. abstract class user1
  13. {
  14. abstract protected function name();
  15. }
  16. }
  17. //3.再建立一个trait,并且在trait中实现以上接口和抽象类中的方法
  18. if (!trait_exists('user2')){
  19. trait user2
  20. {
  21. public function user()
  22. {
  23. return '我的名字是';
  24. }
  25. public function name()
  26. {
  27. return '程东旭';
  28. }
  29. }
  30. }
  31. //4.在建立一个实现类,并且use以上trait
  32. if (!class_exists('user3')){
  33. class user3
  34. {
  35. use user2;
  36. }
  37. }
  38. $user = new user3();
  39. echo $user->user() . $user->name();

总结

抽象类、接口和普通类混合使用可以简洁工作类中的代码,代码看起来更加优雅

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

批改状态:合格

老师批语: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+教程免费学