Blogger Information
Blog 62
fans 7
comment 2
visits 58136
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
Trait 组合与接口
我是郭富城
Original
616 people have browsed it

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 类相关典型问题。

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:trait就像是一个游离在外的孤儿, 希望被主人收留 , 这个主人可以类或抽象类,或更大的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