博客列表 >PHP trait与接口、抽象类联合编程

PHP trait与接口、抽象类联合编程

蔚蓝世纪
蔚蓝世纪原创
2020年05月10日 11:02:22651浏览

一、trait组合同名方法命名冲突的解决方案

trait组合如果出现同名方法,可以选择下面三种方法来解决。
  1. 替换:使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。
  2. 别名:使用as操作符为同名中的其中一个方法引入别名。注意,as 操作符不是对方法进行重命名,也不会影响其方法。
  3. 修改trait成员的访问控制。
如:
  1. trait tH1
  2. {
  3. public function ds()
  4. {
  5. return $name = '100-apples';
  6. }
  7. }
  8. trait tH2
  9. {
  10. public function ds()
  11. {
  12. return $name = '100-apples';
  13. }
  14. }
  15. trait tH3
  16. {
  17. use tH1, tH2 {
  18. tH1::ds insteadOf tH2;//指定用tH2的方法
  19. tH2::ds as nd2;//指定tH在执行时使用td2这个名字
  20. }
  21. use tH1 {ds as public td1;}//还可以修改trait成员的访问控制,但是public若修改为protected则会出现错误
  22. }
  23. class myclass
  24. {
  25. use tH3;
  26. }
  27. $myclass = new myclass();
  28. echo $myclass->ds();
  29. echo '<hr>';
  30. echo $myclass->nd2();
  31. echo '<hr>';
  32. echo $myclass->td1();
输出:

二、修改trait成中的访问控制

  1. trait He {
  2. public function fHe() {
  3. echo '我和我的祖国!';
  4. }
  5. }
  6. class MyC1 {
  7. use He;
  8. }
  9. // 修改 sayHello 的访问控制
  10. class MyC2 {
  11. use He { fHe as protected; }//因为可见性变为受保护,所以打印不出
  12. }
  13. // 给方法一个改变了访问控制的别名
  14. class MyC3 {
  15. use He { fHe as private prifHe; }//因为可见性变为私有,所以打印不出
  16. }
  17. $MyC1 = new MyC1();
  18. $MyC2 = new MyC2();
  19. $MyC3 = new MyC3();
  20. echo $MyC1->fHe();
  21. echo $MyC2->fHe();
  22. echo $MyC3->fHe();

三、trait实现接口方法的优点

  1. 减少了代码的复杂性。
  2. 弥补了PHP单继承的缺陷。
  3. 单个trait可以有多个trait组成。
  4. 在单个class中,可以使用多个trait
四、trait实现接口方法的缺点
  1. trait会覆盖调用类继承的父类方法。
  2. trait无法像Class一样使用new实例化。

五、trait与接口、抽象类联合编程实践

制作变色方块的思路:

  1. html做方块。
  2. CSS设置样式。
  3. 定义一个接口,生成唯一的ID
  4. trait实现接口方法。
  5. 定义一个类class来继承接口。
  6. xplode将颜色分配给方块。
  7. 点击鼠标刷新页面,方块会翻转并且变色。(觉得这个小实验如果用JS会不会更方便实现呢?)

总结

真切地感受到什么叫做“眼高手低”,一方面是因为知识还没有学完全,另一方面想的出来却做不出来,真是捉急呀。后面专门发一篇博文来补上这个小实践。复习去。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议