博客列表 >PHP接口与trait

PHP接口与trait

Jason
Jason原创
2020年05月02日 21:01:08652浏览

php接口与trait的使用

简单的继承,只能实现单继承,如果想要多继承的话,就必须使用interface(接口),通过多个接口的继承,来达到目的,通过这个案例来了解一下。

接口技术

接口技术主要用来实现,三大特性中的多态,那多态是什么呢?
多态最直接的定义就是让具有继承关系的不同类对象,可以对相同名称的成员函数调用,产生不同的反应结果

  • 接口的声明只需要在类名前面加上interface;
  • 接口里面的方法全部都是抽象方法,且方法必须为public;
  • 类可以实现多个接口(也就是实现多继承);
  • 接口也可以继承

实例:

  1. // 这里一个接口,里面有三个抽线方法,接口可以理解为一种抽象类,因为里面的类默认就是抽象的,变量也是抽象的
  2. interface iShopping
  3. {
  4. const money = '5000';
  5. public function buyPhone($type);
  6. public function buyComputer($type);
  7. }
  8. interface iGoshopping
  9. {
  10. const distance = '50';
  11. public function goWalk($time);
  12. public function goTaix($money);
  13. }
  14. // 实现类
  15. class User implements iShopping,iGoshopping
  16. // 可以看到User继承了两个类,就间接的实现了多继承,
  17. // 但注意必须将接口的方法全部实现,少一个都不行
  18. {
  19. public function goWalk($time)
  20. {
  21. if($time > 2):
  22. echo '走不过去'.'<br>';
  23. else:
  24. echo '能走过去'.'<br>';
  25. endif;
  26. }
  27. public function goTaix($money)
  28. {
  29. if($money > 50):
  30. echo '太贵了,打不起车'.'<br>';
  31. else:
  32. echo '可以打车'.'<br>';
  33. endif;
  34. }
  35. public function buyPhone($type)
  36. {
  37. echo '可以买'. $type.'<br>';
  38. }
  39. public function buyComputer($type)
  40. {
  41. echo '可以买的电脑'.$type.'<br>';
  42. }
  43. }
  44. $user = new User;
  45. $user -> goWalk(5);
  46. $user -> goTaix(20);
  47. $user -> buyComputer('华为');
  48. $user -> buyPhone('小米');

输出:

  1. 走不过去
  2. 可以打车
  3. 可以买的电脑华为
  4. 可以买小米

trait的使用

1.php中trait是什么?

看上去有点像类又像接口,既有类的常规属性,又有抽象的方法,其实都不是,trait可以看作是类的部分是按,可以引用到现有的多个PHP类中,起作用只有两个:表明类可以做什么;提供模块化实现。Trait是一种代码复用技术,为PHP的单继承限制提供一套灵活的代码复用机制。

2.trait的使用场景:

当有一个方法需要在很多的类中使用时,该怎么处理?
通常一般的处理方式是,写一个基础类,在基类中实现这个方法,然后所有类都继承这个基类。
这是一种处理方法,单不是最好的处理方式。通常采用继承的情况是:几个类具有很大的相似性。比如人作为一个基类,学生、工人、等继承‘人’ 这个基类来扩展。

由此,trait的作用就出来了,trait可以在多个类中使用

4.trait的使用

示例:

  1. // trait实例
  2. // trait的代码复用,与优先级
  3. trait iFruit
  4. {
  5. // 常规属性
  6. protected $fruit = 'banana';
  7. public function getFruit()
  8. {
  9. return '名称'.$this->fruit.'<br>';
  10. }
  11. // 静态
  12. public static $weight = '1.9';
  13. public static function getWeith()
  14. {
  15. return '重量'.self::$weight.'<br>';
  16. }
  17. // 抽象
  18. // 抽象静态属性
  19. public static $source;
  20. // 抽象静态方法
  21. abstract public static function getSource();
  22. }
  23. class Dad
  24. {
  25. public static function getWeith()
  26. {
  27. return '父类中的方法'.__METHOD__.'<br>';
  28. }
  29. }
  30. class Banana extends Dad
  31. {
  32. // 可以看到子类继承了父类,但是trait中的同名方法将父类中同名方法重写了
  33. // 继承关系:子类 > trait > 父类
  34. // trait的功能之一,代码复用
  35. use iFruit;
  36. public static function getSource()
  37. {
  38. return '产地'.self::$source;
  39. }
  40. public function print()
  41. {
  42. echo $this->getFruit(). self::getWeith() .self::getSource();
  43. }
  44. }
  45. banana::$source = '泰国';
  46. $banana = new Banana();
  47. $banana -> print();

输出:

  1. 名称banana
  2. 重量1.9
  3. 产地泰国

总结

接口可以实现多继承,也实现面向对象中的多态,就是对相同名称的函数的调用,而产生不同结果,trait提供了代码复用技术,在一些需要重复使用的方法或属性,我们就可以用trait把他们做好,在子类中引用就行,总的来说面向对象编程主要就围绕着两方面在讲,三个特性,封装,继承,多态,设计与实现,所有的技术都可以总结到这个上面,这可能就是代码的艺术,不仅仅是代码,让代码变得更加灵活多变。

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