7.0 抽象类与接口


当定义一个类时,常常需要定义一些方法来描述该类的行为特征、但有时这些方法的实现方式是无法确定的,此时就可以使用抽象类和接口。

抽象类和接口用于提高程序的灵活性、抽象类是一种特殊的类,而接口又是一种待殊的抽象类。

接下来本节将针对抽象类和接口进行详细讲解。

7.1 抽象类


当在定义一个类的 时候,其中所霜的某些方法暂时并不能完全定义出来,而是让其继承的类来实现,此时就可以用到抽象类。

比如定又一个动物类,每种动物有一“叫” 的方法,面每种动物叫的方式不同,因此可以将动物类定义为一个抽象类。

定义抽象类需要使用 abstract 关键字来修饰,语法格式具体如下:

 abstract class  类名{

    //类成员

 }

由于每种动物叫的方式不同,所以需要将动物同的shut方法定义成抽象的, 即只有方法声明面设有方法体的方法,在子类继承时再来编写该方法的具体实规,这种特珠的方法称为抽象方法,其语法格式如下

 abstract function 方法名 ();

为了更好的理解抽象类和抽象方法的使用,接下来t通过个案例来演示

例7-19

 <?php
//使用abstract关键字声明一个抽象类
abstract class Animal{
//在抽象类中声明抽象方法
abstract public function shout();
}
//定义Dog类继承自Animal类
class Dog extends Animal{
//实现抽象方法shout()
public function shout()
{
echo "汪汪......<br>";
}
}
//定义Cat类继承自Animal类
class Cat extends Animal{
//实现抽象方法shout()
public function shout()
{
echo "喵喵......<br>";
}
}
$dog=new Dog();
$dog->shout();
$cat=new Cat();
$cat->shout();
?>

运行结果

例7-19中,第3-6行代码定义了一个抽象类Animal. 然后使Dog类和Cat类继承Animal类并实现抽象方法shout(). 最后分别调用cat对象和dog对象的shout()方法,输出不同动物对应的叫声

注意:

(1)抽象类不能被实例化。

(2)抽象类可以没有抽象方法,但有抽象方法的抽象关才有意义,一旦类包含了抽象方法,则这个类必须声明为abstract。

(3)抽象关中可以有非抽象方法、成员属性和常量。

(4)抽象方法不能有函数体,它只能存在于抽象类中。

(5)如果一个类继承了某个抽象类,则它必须实现该抽象类的所有抽象方法、除非它自己也声明为抽象类。

7.2 接口


如果一个抽象类中的所有方法都是抽象的、则可以将这个类用另外一种方式来定义。即接口。在定义接口时,需要使用interface关键字,具体示例代码如下:

 interface Animal{

    public function run ();

    public function breathe();  

 }

定义接口与定义一个标准的类类似,但其中定义的所有的方法都是空的。

需要注意的是接口中的所有方法都是公有的,也不能使用 final关键字来修饰

由于接口中定义的都是抽象方法,没有具体实现,需要通过类来实现接口。实现接口使用 implements 关键字。

接下来通过一个案例来学习,如例7-20 所示

 <?php
//定义Animal接口
interface Animal{
public function run();
public function shout();
}
//定义Dog类,实现了Animal接口
class Dog implements Animal{
public function run(){
echo "狗在奔跑<br>";
}
public function shout(){
echo "汪汪……<br>";
}
}
//定义Cat类,实现了Animal接口
class Cat implements Animal{
public function run(){
echo "猫在奔跑<br>";
}
public function shout(){
echo "喵喵……<br>";
}
}
$cat=new Cat();
$cat->run();
$cat->shout();
$dog=new Dog();
$dog->run();
$dog->shout();
?>

运行结果

在例7-20中,首先定义了接口Animal,在接口Animal中声明了抽象方法run()和shout().
然后分别通过Cat类和Dog类实现了Animal接口最后通过cat和dog对象调用run()和shout()方法。
在PHP中类是单继承的,但一个类却可以实现多个接口,并且这些接口之间用逗号分展开,接下来通过一个具体的案例来学习,
如例7-21所示。 

例7-21

  <?php
//定义Animal接口
interface Animal{
public function run();
public function shout();
}
//定义LandAnimal接口
interface LandAnimal{
public function LiveOnLand();
}
//定义Dog类,实现了Animal和LandAnimal接口
class Dog implements Animal,LandAnimal{
public function LiveOnLand(){
echo"狗在陆地上生活<br>";
}
public function run(){
echo "狗在奔跑<br>";
}
public function shout(){
echo "汪汪……<br>";
}
}
$dog=new Dog();
$dog->LiveOnLand();
$dog->run();
$dog->shout();
?>

运行结果

在例7-21中,动物类Dog同时实现了接口Animal和LandAnimal,

通过dog对象调用了LandAnimal中的LiveOnLand()方法

和Animal接口中的run()和shout()方法

扩展-继承和接口的配合使用


在使用implements关键宇实现接口的同 时,还可以使用extends 关键字继承一个类。

即在继承一个类的同时实现接口,但一定要先使用extends继承一个类,再使用implements实现接口,

具体示例如下所示:

 class 类名 extends 父类名 implements 接口1,接口2,....接口n{

      //实现所有接口中的抽象方法

 }

PHP的单继承机制可保证类的纯洁性,比C++中的多继承机制简洁。

但是不可否认,对子类功能的扩展有一定影响。

所以我们认为实现接口可以看作是对继承的一种补充。

实现接口可在不打破继承关系的前提下,对某个类功能扩展,非常灵活。

浅谈PHP面向对象编程(七、抽象类与接口)的更多相关文章

  1. 浅谈python面向对象编程和面向过程编程的区别

    面向过程:分析出解决问题所需要的步骤,然后用函数把这些步骤一步步实现,使用的时候再一个个的依次调用即可. 优点:性能高 缺点:相较于面向对象而言,不易维护,不易复用,不易扩展 适合于小型的项目面向对象 ...

  2. 浅谈我对C#中抽象类与接口的理解

    C#中的抽象类与接口有些相似,初学者很容易混淆,今天就让我来谈谈对二者的理解. 首先我们得明确二者的含义,分述如下: 如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个 ...

  3. 廖雪峰Java2面向对象编程-4抽象类和接口-2接口

    1.接口的定义 抽象方法本质上是定义接口规范. 在抽象类中定义了一个抽象方法,子类中必须实现这个抽象方法. public abstract class Person{ public abstract ...

  4. 浅谈PHP面向对象编程(二、基础知识)

    和一些面向对象的语言有所不同,PHP并不是一种纯面向对象的语言,包PIP它支持面向对象的程序设计,并可以用于开发大型的商业程序.因此学好面向对象输程对PHP程序员来说也是至关重要的.本章并针对面向对象 ...

  5. 浅谈PHP面向对象编程(九、设计模式)

    9.0 设计模式 在编写程序时经常会遇到一此典型的问题或需要完成某种特定需求,设计模式就是针对这些问题和需求,在大量的实践中总结和理论化之后优选的代码结构编程风格,以及解决问题的思考方式. 设计模式就 ...

  6. 浅谈PHP面向对象编程(一、简介)

    传统的面向过程 将要完成的工作,分作若干个步骤,或再细分为子步骤,然后后步骤从前往后一步一步完成,最初达致目标. 现代的面向对象 将要完成的工作拆分为“一个一个对象”的任务(功能),每个对象独自完成自 ...

  7. 浅谈PHP面向对象编程(八、多态)

    8.0  多态 在设计一个成员方法时,通常希望该方法具备一定的通用性.例如要实现一个动物叫的方法,由于每个动物的叫声是不同的,因此可以在方法中接收-个动物类型的参数的对象当传人猫类对象时就发出猫类的叫 ...

  8. 浅谈PHP面向对象编程(六、自动加载及魔术方法)

    6.0 自动加载及魔术方法  6.1 自动加载 在PHP开发过程中,如果希望从外部引入一个class.通常会使用incluae和requre方法把定义这个class的文件包含进来.但是,在大型的开发项 ...

  9. 浅谈PHP面向对象编程(五、继承)

    5.0 继承 5.1 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使许多事物之间形成一种关系体系 . 例如猫和狗都属于动物,程序中 ...

随机推荐

  1. LINUX中的DNS服务---高速缓存DNS

    一.什么是DNS     Domain Name System,域名系统.     万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网.他主要负责把域名和IP的相互转换 ...

  2. Spring AOP的使用报错!

    用构造方法注入的时候 需要把无参构造方法手动加上 AOP底层会调用无参构造方法. 不加则报错:Superclass has no null constructors but no arguments ...

  3. 《Drools7.0.0.Final规则引擎教程》第4章 4.4 约束(Pattern的一部分)

    4.4.3 约束(Pattern的一部分) 前面我们已经介绍了条件约束在Pattern中位置了,那么什么是条件约束呢?简单来说就是一个返回true或者false的表达式,比如下面的5小于6,就是一个约 ...

  4. [置顶] 不再迷惑,也许之前你从未真正懂得 Scroller 及滑动机制

    学习本来就是从困惑中摸索问题答案的过程,能够描述出来问题就已经成功了一半.只要发现了困扰你的东西是什么,那么你就离解答出来不远了.----肯尼斯 R. 莱伯德 一直以来,Android 开发中绕不过去 ...

  5. 开源一款资源分享与下载工具 —— 电驴(eMule)

    这里分享一款资源分享与下载工具--电驴,其实严格来说,应该叫电骡,这是我维护的版本,eMuleVeryCD版本,VeryCD是一个不错的资源分享网站:http://www.verycd.com/.大概 ...

  6. 服务上部署jmeter远程机

    1.首先连接服务器 2.在/home下新创建一个自己的文件夹 ]#useradd zhuxiao ]#ls 显示新的用户并在home下创建zhuxiao文件夹 ①切换到用户zhuxiao目录下 ]#s ...

  7. Scikit-learn方法使用总结

    在机器学习和数据挖掘的应用中,scikit-learn是一个功能强大的python包.在数据量不是过大的情况下,可以解决大部分问题.近期在学习使用scikit-learn的过程中,我自己也在补充着机器 ...

  8. Tensorflow 运行警告提示 Your CPU supports instructions that this TensorFlow binary was not compiled to use

    由于现在神经网络这个东西比较火,准确的说是深度学习这个东西比较火,我们实验室准备靠这个东西发几个CCF A类的文章,虽然我不太懂这东西,兴趣也一般都是毕竟要跟随主流的,于是今天安装起了 Tensorf ...

  9. 掌握Git撤销操作,随心所欲控制文件状态

    本文主要讨论和撤销有关的 git 操作.目的是让读者在遇到关于撤销问题时能够方便迅速对照执行解决问题,而不用去翻阅参数繁多的 git 使用说明. 一开始你只需了解大致功能即可,不必记住所有命令和具体参 ...

  10. Notes on UE4-Blender workflow

    In UE4: When you import a rigged model (mesh parents armature) to UE4, it will be converted to a Ske ...