博客列表 >PHP接口和抽象类|接口与抽象类的区别与联系

PHP接口和抽象类|接口与抽象类的区别与联系

幸福敲门的博客
幸福敲门的博客原创
2021年02月04日 15:12:481497浏览

自己定义一个接口和抽象类,并实现它,对比接口与抽象类的区别与联系,并实例演示

一、抽象

1.1抽象方法

没有方法体: 一个方法不使用 “{}”,直接使用分号结束的方法。
如果是抽象方法,必须使用 abstract 来修饰

1.2 抽象类

如果一个类中有一个方法是抽象方法,则这个类是抽象类。 如果声明一个抽象类,必须使用 abstract 来修饰
只要使用 abstract 修饰的类就是抽象类。不一定有抽象方法
抽象类是一种特殊的类,在抽象类中可以有抽象方法。
除了在抽象类中可以有抽象方法,其他和正常的类完全一样。
抽象类不能实例化对象
如果看见抽象类就必须写这个类的子类。将抽象类的抽象方法覆盖(加上方法体)
子类必须全部实现抽象类的抽象方法。如果只实现部分,那么子类也必须是抽象类。

1.3抽象方法的作用

**抽象方法的作用就是规定子类必须有这个方法的实现,功能交给子类。 只写出结构,而没有实现,实现交给子类按照自己的功能去实现。

规范所有子类的写法**

  1. <?php
  2. abstract class User
  3. {
  4. public $name;
  5. public $age;
  6. abstract function say();
  7. public function walk(){}
  8. function sleep(){
  9. echo "nizaitaxianghuanhaoma!";
  10. }
  11. }
  12. // 抽象类必须通过它的子类才可以使用
  13. class User1 extends User
  14. {
  15. // 抽象类的实现类(子类)必须将抽象类的抽象方法实现
  16. function say(){
  17. echo "志强中国人<br>";
  18. }
  19. }
  20. class User2 extends User
  21. {
  22. // 抽象类的实现类(子类)必须将抽象类的抽象方法实现
  23. function say(){
  24. echo "Welcome to Beijing<br>";
  25. }
  26. }
  27. $a1= new User1();
  28. $a2 = new User2();
  29. $a1->say();
  30. $a2->say();

图示:
抽象类的实现类

二、接口

抽象类是一种抽象的类,接口是一种特殊的抽象类。
抽象类和接口中都有抽象方法
抽象类和接口都不能实例化对象
抽象类和接口使用作用一样,都是规范
接口中的方法,必须全部是抽象方法。所以在接口中,可以省略 abstract
接口中的成员属性,必须是常量(不能有变量)。
所有的权限必须是公有的(public)
声明接口使用 interface
可以使用extends继承自另一个接口。(接口和接口只有扩展新抽象方法,没有覆盖的关系)
可以使用一个类来实现接口中的全部方法,也可以使用一个抽象类,来实现接口中的部分方法
(类与接口,抽象类与接口 =》有实现接口中的抽象方法)
类(抽象类)实现接口使用关键字 implements
实现多个接口只需要使用逗号分开即可。

课堂案例:

  1. <?php
  2. // 接口的语法
  3. // 声明
  4. interface iUser
  5. {
  6. // 接口中只允许声明二类成员: 类常量, 公共抽象方法
  7. // 接口常量
  8. const APP_NAME = '京东商城';
  9. // 公共抽象方法,没有实现过程
  10. public static function a1(...$args): string;
  11. // 构造方法
  12. public function __constract(...$args);
  13. }
  14. // 使用: 必须创建一个实现类
  15. // 实现类
  16. class User1 implements iUser
  17. {
  18. // const a = 1;
  19. // 在实现类中必须将接口中声明的抽象方法全部实现了
  20. public static function a1(...$args): string
  21. {
  22. return print_r($args,true);
  23. }
  24. // 构造方法
  25. public function __constract(...$args)
  26. {
  27. return new static;
  28. }
  29. }
  30. $obj = new User1();
  31. echo User1::APP_NAME, '<br>';
  32. // 尽可能直接用接口来访问类常量
  33. echo iUser::APP_NAME, '<br>';
  34. // 实例可以调用 静态方法,但是不能调用静态属性
  35. echo $obj->a1(' 商品','价格','型号','产地','优惠价'),'<br>';
  36. // 尽可能用类来调用静态方法
  37. echo User1::a1(' 商品','价格','型号','产地','优惠价'),'<br>';

图示:
接口案例

三、抽象类和接口的区别

1、对接口的使用是通过关键字implements。对抽象类的使用是通过关键字extends。当然接口也可以通过关键字extends继承。
2、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装。(另JAVA接口中的成员变量都要声明为public static final类型)
3、接口没有构造函数,抽象类可以有构造函数。
4、接口中的方法默认都是public类型的,而抽象类中的方法可以使用private,protected,public来修饰。
5、一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。

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