Blogger Information
Blog 40
fans 0
comment 1
visits 39806
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
Trait的五种应用场景
Dong.
Original
865 people have browsed it

声明:

Tirait特性:
方法集合,临时类,类中类,可以嵌套到宿主类
拥有三种成员:1.常规成员,2.静态成员,3.抽象成员(没有属性)
优先级:自身方法 > trait的方法 > 继承的方法

1.Trait功能:代码复用

  1. <?php
  2. //代码复用
  3. // 在trait类中定义方法,在不同类中调用
  4. trait tDemo
  5. {
  6. public function show($name,$age,$like)
  7. {
  8. printf('Hello,大家好,我叫%s,今年%s,%s。',$name,$age,$like);
  9. }}
  10. class User1
  11. {
  12. use tDemo;
  13. protected $name = '王强';
  14. protected $age = 19;
  15. protected $like ='爱打篮球';
  16. public function introduce(){
  17. return $this->show($this->name,$this->age,$this->like);
  18. }}
  19. class User2
  20. {
  21. use tDemo;
  22. protected $name = '李娟';
  23. protected $age = 20;
  24. protected $like ='爱跳舞';
  25. public function introduce()
  26. {
  27. return $this->show($this->name,$this->age,$this->like);
  28. }}
  29. class User3
  30. {
  31. use tDemo;
  32. protected $name = '兰兰';
  33. protected $age = 19;
  34. protected $like ='爱画画';
  35. public function introduce()
  36. {
  37. return $this->show($this->name,$this->age,$this->like);
  38. }}
  39. (new User1)->introduce();
  40. echo '<hr>';
  41. (new User2)->introduce();
  42. echo '<hr>';
  43. (new User3)->introduce();

输出结果:


2.Trait功能:在继承上下文中的应用

  1. <?php
  2. //在继承上下文中的应用
  3. trait Demo
  4. {
  5. public static function way()
  6. {
  7. return 'trait中的方法' . __METHOD__;
  8. }}
  9. // 父类/超类/基类
  10. class Father
  11. {
  12. use Demo;
  13. public static function way()
  14. {
  15. return '基类中的方法' . __METHOD__;
  16. }}
  17. // 子类/扩展类
  18. class Son extends Father
  19. {
  20. use Demo;
  21. public static function way()
  22. {
  23. return '子类中的方法' . __METHOD__;
  24. }}
  25. //子类同名成员优先级大于父级同名成员
  26. //子类>trait>父类
  27. echo son::way();

输出结果:


3.Trait功能:实现功能扩展

  1. <?php
  2. //扩展类功能的扩展
  3. trait tDemo1
  4. {
  5. // 打印所有属性(公共方法)
  6. public function getProps()
  7. {
  8. printf('%s', print_r(get_class_vars(__CLASS__), true));
  9. }}
  10. trait tDemo2
  11. {
  12. // 打印所有方法(公共方法)
  13. public function getMethods()
  14. {
  15. printf('%s', print_r(get_class_methods(__CLASS__), true));
  16. }}
  17. trait tDemo3
  18. {
  19. use tDemo1, tDemo2;
  20. }
  21. class Demo1
  22. {
  23. use tDemo1, tDemo2; //可引用多个trait实现功能扩展
  24. protected $name = '李军';
  25. protected $gender = '男';
  26. public function show()
  27. {
  28. return $this -> getProps();
  29. }}
  30. class Demo2
  31. {
  32. use tDemo3; //tDemo3引入了tDemo1、tDemo2,此时只引入一个trait就可以
  33. protected $name = '张丹';
  34. protected $gender = '女';
  35. public function show()
  36. {
  37. return $this -> getProps();
  38. }}
  39. echo 'Demo1' . "<br>";
  40. echo '类属性:', (new Demo1)->getProps() . "<br>";
  41. echo '类方法:', (new Demo1)->getMethods();
  42. echo '<hr>';
  43. echo 'Demo2' . "<br>";
  44. echo '类属性:', (new Demo2)->getProps() . "<br>";
  45. echo '类方法:', (new Demo2)->getMethods();

输出结果:


4.在Trait组合中命名冲突的解决方案

  1. <?php
  2. //在trait组合中命名冲突的解决方案
  3. trait Demo1
  4. {
  5. public function show()
  6. {
  7. return '我是:'.__METHOD__;
  8. }
  9. }
  10. trait Demo2
  11. {
  12. public function show()
  13. {
  14. return '我是:'.__METHOD__;
  15. }
  16. }
  17. trait Demo3
  18. {
  19. use Demo1, Demo2 {
  20. // 给Demo2::show()起个别名: tb2
  21. Demo2::show as tb2;
  22. // 调用Demo1::show()替换成Demo2::show()
  23. Demo1::show insteadOf Demo2;
  24. }
  25. }
  26. // 工作类尽可能写得代码清晰,简洁
  27. class Demo
  28. {
  29. use Demo3;
  30. }
  31. echo (new Demo)->show();
  32. echo '
  33. ';
  34. // 别名访问Demo2::show
  35. echo (new Demo)->tb2();

输出结果:

5.Trait和interface的组合

  1. <?php
  2. //trait和interface的组合
  3. // 接口
  4. interface iDemo
  5. {
  6. public static function index();
  7. }
  8. // trait
  9. trait tDemo
  10. {
  11. // 将接口中的抽象方法的实现过程放在trait中实现,并在工作类中调用
  12. public static function index()
  13. {
  14. return __METHOD__;
  15. }}
  16. // 实现类
  17. class Hello implements iDemo
  18. {
  19. use tDemo;
  20. }
  21. // 客户端
  22. echo Hello::index();

输出结果:

总结:

  • 不同与继承,类中使用user关键字引入trait成员
  • 在宿主中还必须把trait中的抽象方法实现
  • trait中的方法和成员看成类方法和成员
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:
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