博主信息
博文 40
粉丝 0
评论 1
访问量 50077
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
Trait的五种应用场景
Dong.
原创
1157人浏览过

声明:

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中的方法和成员看成类方法和成员
批改老师:天蓬老师天蓬老师

批改状态:合格

老师批语:
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学