博客列表 >PHP - 面向接口编程

PHP - 面向接口编程

晴天
晴天原创
2020年04月30日 17:40:47807浏览

1. 接口使用场景:接口的多继承

  1. <?php
  2. // 接口的使用场景2 :多接口继承
  3. // 接口可以突破php类的继承限制,允许多继承,实现多层级的接口
  4. // 创建第一个接口
  5. interface api_1
  6. {
  7. const NAME = 'michael';
  8. }
  9. // 第二个继承第一个
  10. interface api_2 extends api_1{
  11. const AGE = 25;
  12. }
  13. // 第三个继承前两个
  14. interface api_3 extends api_1 ,api_2{
  15. // 接口抽象方法
  16. public function user();
  17. }
  18. // 实现接口类
  19. // 因为上面的接口api_3已经继承了前两个,所以这里只写api_3即可,当然也支持加上 ’api_1,api_2‘
  20. class Name implements api_3
  21. {
  22. // 先实现抽象方法
  23. public function user(){
  24. return '姓名:'.api_3::NAME;
  25. }
  26. }
  27. echo (new Name)->user();

2. trait

  1. //trait 功能与语法 PHP5.4+ 实现代码的复用
  2. //trait 与抽象类,接口 一样不能被实例化,只能嵌入到宿主类中使用
  3. //trait 是一个特殊类:只能使用 常规 静态 抽象 不能用类常量
  4. trait tDemo
  5. {
  6. // 常规属性
  7. protected $name = 'michael';
  8. //常规方法
  9. public function getName()
  10. {
  11. return $this->name;
  12. }
  13. // 静态属性
  14. public static $sex = '男';
  15. //静态方法
  16. public function getSex()
  17. {
  18. return self::$sex;
  19. }
  20. // 抽象属性
  21. public static $age;
  22. // 抽象方法
  23. abstract public static function setAge();
  24. }
  25. //创建工作类引用
  26. class Demo
  27. {
  28. use tDemo;
  29. public static function setAge()
  30. {
  31. return self::$age;
  32. }
  33. }
  34. //访问
  35. Demo::$age = 30;
  36. echo Demo::setAge();
  37. echo '<hr>';
  38. $demo = new Demo();
  39. echo '姓名'.$demo->getName().'年龄:'.Demo::setAge().'性别'.Demo::getSex();
  1. <?php
  2. //trait 功能1 代码复用
  3. //创建一个公共方法库
  4. trait Means{
  5. // 乘法
  6. public function Way_1($a,$b){
  7. return $a*$b;
  8. }
  9. // 除法
  10. public function Way_2($a,$b){
  11. return $a/$b;
  12. }
  13. // 加法
  14. public function Way_3($a,$b){
  15. return $a+$b;
  16. }
  17. // 减法
  18. public function Way_4($a,$b){
  19. return $a-$b;
  20. }
  21. }
  22. //实现类
  23. class White
  24. {
  25. use Means;
  26. }
  27. //创建类示例
  28. $white = new White;
  29. //乘法
  30. echo $white->Way_1(2,8).'<hr>';
  31. //除法
  32. echo $white->Way_2(8,2).'<hr>';
  33. //加法
  34. echo $white->Way_3(2,8).'<hr>';
  35. //减法
  36. echo $white->Way_4(8,2).'<hr>';
  37. //输出 16 4 10 6

总结

trait 在继承上下文环境中,具有优先级,通过优先设置,降低单继承的影响
优先级比较 当前类 > trait > 当前类的父类
trait 中只写方法不要写属性,否则会跟宿主类中的同名属性发生冲突产生致命错误

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