Blogger Information
Blog 8
fans 0
comment 3
visits 8178
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
演示Trait组合解决命名冲突和修改Trait访问控制,以及Trait和接口与抽象类混合使用
程东旭
Original
803 people have browsed it

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();

总结

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

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:trait可以将类中方法,进行更好的归类与整理, 对用户提供一个更加简洁的接口
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