PHP面向对象 1.8 抽象类与接口

约定不等于承诺〃 2022-08-18 02:46 224阅读 0赞

抽象类与接口类似,都是一种比较特殊的类。抽象类是一种特殊的类,而接口是一种特殊的抽象类

1. 抽象类

抽象方法没有方法体,指没有花括号及其中的内容,而是直接在声明方法时直接在后面加上分号结束。声明抽象方法还要使用关键字abstract修饰。

abstract function fun1();//不能有花括号及其中的内容,直接在方法名的括号后面加上分号,并且用abstract修饰

只要在声明类时有一个方法是抽象方法,那么这个类就是抽象类,抽象类也要使用abstract关键字修饰。在抽象类中可以有不是抽象的成员方法和成员属性,但访问权限不能使用private关键字修饰为私有的。

  1. <?php abstract class Person{ protected $name; //声明一个存储人的名字的成员 protected $country; //声明一个存储人的国家的成员 function __construct($name = "",$country = "china"){ $this->name = $name; $this->country = $country; } //在抽象类中声明一个没有方法体的抽象方法 abstract function say(); //在抽象类中声明一个没有方法体的抽象方法 abstract function eat(); //在抽象类中可以声明正常的非抽象方法 function run(){ echo "使用两条腿走路<br/>"; //有方法体,输出一条语句 } }

抽象类中由于含有没有被实现的抽象方法,所以抽象类是不能被实例化的,即创建不了对象,也就没法直接使用它。
抽象类为子类定义公共的接口,将它的操作交给子类实现,相当于为子类定义了一种规范。
子类必须把父类中的抽象方法全部实现,否则子类中还存在抽象方法,所以还是抽象类,不能实例化对象

  1. //声明一个类去继承抽象类Person
  2. class ChineseMan extends Person{
  3. //将父类中的抽象方法覆盖,按自己的需求去实现
  4. function say(){
  5. echo $this->name."是".$this->country."人,讲汉语<br/>";//实现内容
  6. }
  7. function eat(){
  8. echo $this->name."使用筷子吃饭<br/>";
  9. }
  10. }
  11. class Americans extends Person{
  12. function say(){
  13. echo $this->name."是".$this->country."人,讲英语";
  14. }
  15. function eat(){
  16. echo $this->name."使用刀叉吃饭<br/>";
  17. }
  18. }
  19. $chineseMan = new ChineseMan("常智","中国");
  20. $americans = new Americans("chris-chang","美国");
  21. $chineseMan -> say();
  22. $chineseMan -> eat();
  23. $americans -> say();
  24. $americans -> eat();

2. 接口技术

为了解决PHP只能单继承的问题,PHP引入接口。接口中声明的方法必须都是抽象抽象方法。另外不能在接口中声明变量,只能使用const关键字声明为常量成员属性。

  1. interface 接口名称{ //使用interface关键字声明接口
  2. //常量成员 //接口中的成员属性只能是常量,不能是变量
  3. //抽象方法 //接口中的所有方法必须是抽象方法
  4. }

接口中的所有的方法都要求是抽象方法,所以就不需要在方法前使用abstarct关键字标识,而且在接口中也不需要显式地使用public访问权限进行修饰,接口的声明使用interface关键字,可以直接使用接口名称在接口外面获取常量成员的值

一个接口可以继承另一个接口

  1. <?php interface One{ const CONSTANT = 'CONSTANT VALUE'; function fun1(); function fun2(); } interface Two extends One{ //继承One接口 function fun3(); function fun4(); }

如果要通过类去继承接口,需要使用implements关键字是实现,下面是使用Three抽象类实现One接口中的方法。但如果要想实例化对象,这个抽象类还需要有子类把所有的抽象方法都实现才行。

  1. <?php //声明一个抽象类实现接口One的fun2() abstract class Three implements One{ function fun2(){ //实现内容 } } //声明一个类实现接口One中的全部方法 class Four implements One{ function fun1(){ //实现内容 } function fun2(){ //实现内容 } }

PHP是单继承,一个类只能有一个父类,但是一个类可以实现多个接口,将要实现的多个接口之间使用逗号隔开,而且在子类中要将所有接口中的抽象方法全部实现才可以创建对象

  1. class 类名 implements 接口一,接口二,...,接口n{ //一个类实现多个接口
  2. //实现接口中的抽象方法
  3. }

可以同时使用”extends”关键字继承一个类,即在继承一个类的同时实现多个接口,但是一定要先使用extends继承一个类,再去使用implements实现多个接口

  1. class 类名 extends 父类名 implements 接口一,接口二,接口三....,接口n{
  2. //实现接口中的抽象方法
  3. }

发表评论

表情:
评论列表 (有 0 条评论,224人围观)

还没有评论,来说两句吧...

相关阅读

    相关 PHP面向对象抽象

    在oop语言中,一个类可以有一个或多个子类,而每个类都有一个公有方法做为外部代码访问其的接口。而抽象方法就是为了方便继承而引入的。 掌握2个为什么? 什么是抽象方法?