博客列表 >Trait 组合与接口

Trait 组合与接口

我是郭富城
我是郭富城原创
2020年05月03日 19:20:11618浏览

Trait 组合与接口

1.Trait 组合的同名方法的命名冲突

  • insteadof替换
  • as改名

    as高级用法修改访问控制

  1. <?php
  2. trait trait1
  3. {
  4. public function eat()
  5. {
  6. echo '朱老师是一个吃货吗?';
  7. }
  8. }
  9. trait trait2
  10. {
  11. public function eat()
  12. {
  13. echo '朱老师不是吃货';
  14. }
  15. }
  16. class Nicola
  17. {
  18. use trait1,trait2
  19. {
  20. trait1::eat insteadof trait2;
  21. trait2::eat as eaten;
  22. }
  23. }

2.在 trait 中改变 trait 成员的访问控制

  • as高级用法,可以修改 trait 中成员的访问控制
  1. <?php
  2. //trait
  3. trait trait1
  4. {
  5. public function eat()
  6. {
  7. echo '朱老师是一个吃货吗?';
  8. }
  9. }
  10. trait trait2
  11. {
  12. public function eat()
  13. {
  14. echo '朱老师不是吃货';
  15. }
  16. }
  17. class Nicola
  18. {
  19. //修改访问权限
  20. // use trait1 {eat as protected;}
  21. //修改别名
  22. use trait1 {
  23. eat as eat1;
  24. }
  25. }
  26. $nicola = new Nicola;
  27. echo $nicola->eat();
  28. echo '<hr>';
  29. echo $nicola->eat1();

3.trait 实现接口方法的优缺点是什么?

  • trait 的出现就像一个小三,能够促进家庭的和谐发展一样,可以横向的在多个家庭间穿梭,大家都喜欢使用。同样,实现接口中定义的抽象方法,而不是通过工作类去实现,展示在用户面前的就只是简单的一个 trait 的引用,代码不仅简单,维护起来也方便。
  • 至于缺点我觉得应该就是他优点本身带来的缺点吧。Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。

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

  • 年终奖抽奖
  1. <?php
  2. //trait和接口的组合
  3. //年终奖抽奖
  4. $prices = ['单车', '摩托', '宝马', '法拉利', '直升机', '战斗机'];
  5. // 接口
  6. interface iKey
  7. {
  8. // 随机抽奖
  9. public static function generateId(int $min, int $max): int;
  10. }
  11. // trait: 真实实现目的
  12. trait tCreateId
  13. {
  14. public static function generateId(int $min, int $max): int
  15. {
  16. return mt_rand($min, $max);
  17. }
  18. }
  19. // 工作类
  20. class DrawPrize implements iKey
  21. {
  22. use tCreateId;
  23. public static function choujiang(array $prices, int $id)
  24. {
  25. return $prices[$id];
  26. }
  27. }
  28. //员工开始抽奖
  29. $id = DrawPrize::generateId(0, 5);
  30. $price = DrawPrize::choujiang($prices, $id);
  31. printf('恭喜你!你的年终奖品是: <span style="color:red">%s</span>', $price);

总结

Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。

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