Blogger Information
Blog 41
fans 0
comment 0
visits 41104
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP接口和抽象类|接口与抽象类的区别与联系
幸福敲门的博客
Original
1502 people have browsed it

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

一、抽象

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、一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。

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