当前位置: 首页 > 编程日记 > 正文

php中的抽象类(abstract class)和接口(interface)

一、 抽象类abstract class

1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类。

2 .抽象类不能被直接实例化。抽象类中只定义(或部分实现)子类需要的方法。子类可以通过继承抽象类并通过实现抽象类中的所有抽象方法,使抽象类具体化。

3 .如果子类需要实例化,前提是它实现了抽象类中的所有抽象方法。如果子类没有全部实现抽象类中的所有抽象方法,那么该子类也是一个抽象类,必须在 class 前面加上 abstract 关键字,并且不能被实例化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
abstract class 
    /** 抽象类中可以定义变量 抽象类中可以定义各种类型成员变量*/
    protected $value1 = 0; 
    private $value2 = 1; 
    public $value3 = 2; 
    /** 也可以定义非抽象方法 */
    public function my_print() 
    
        echo "hello,world/n"
    
    /**
     * 大多数情况下,抽象类至少含有一个抽象方法。抽象方法用abstract关键字声明,其中不能有具体内容。
     * 可以像声明普通类方法那样声明抽象方法,但是要以分号而不是方法体结束。也就是说抽象方法在抽象类中不能被实现,也就是没有函数体“{some codes}”。
     */
    abstract protected function abstract_func1(); 
    abstract protected function abstract_func2(); 
abstract class extends 
    public function abstract_func1() 
    
       echo "implement the abstract_func1 in class A/n"
    
    /** 这么写在zend studio 8中会报错*/
    //abstract protected function abstract_func2(); 
class extends 
    public function abstract_func2() 
    
       echo "implement the abstract_func2 in class A/n"
    

 

4 .如果像下面这样创建了一个继承自 A 的子类 B ,但是不实现抽象方法 abstract_func() :

1
Class B extends A{};

那么程序将出现以下错误:

1
Fatal error: Class B contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (A::abstract_func)

5 .如果 B 实现了抽象方法 abstract_func() ,那么 B 中 abstract_func() 方法的访问控制不能比 A 中 abstract_func() 的访问控制更严格,也就是说:

(1)      如果 A 中 abstract_func() 声明为 public ,那么 B 中 abstract_func() 的声明只能是 public ,不能是 protected 或 private

(2)      如果 A 中 abstract_func() 声明为 protected ,那么 B 中 abstract_func() 的声明可以是 public 或 protected ,但不能是 private

(3)      如果 A 中 abstract_func() 声明为 private ,嘿嘿,不能定义为 private 哦!( Fatal error : Abstract function A::abstract_func() cannot be declared private )

二、 接口interface

1 .抽象类提供了具体实现的标准,而接口则是纯粹的模版。接口只定义功能,而不包含实现的内容。接口用关键字 interface 来声明。

2 . interface 是完全抽象的,只能声明方法,而且只能声明 public 的方法,不能声明 private 及 protected 的方法,不能定义方法体,也不能声明实例变量 。然而, interface 却可以声明常量变量 。但将常量变量放在 interface 中违背了其作为接口的作用而存在的宗旨,也混淆了 interface 与类的不同价值。如果的确需要,可以将其放在相应的 abstract class 或 Class 中。

1
2
3
4
5
6
7
interface iA 
    const AVAR=3; 
    public function iAfunc1(); 
    public function iAfunc2(); 
echo iA:: AVAR;

3 .任何实现接口的类都要实现接口中所定义的所有方法

1
2
3
4
5
class implements iA 
    public function iAfunc1(){echo "in iAfunc1";} 
    public function iAfunc2(){echo "in iAfunc2";} 

否则该类必须声明为 abstract 。

1
abstract class implements iA{} 

4 .一个类可以在声明中使用 implements 关键字来实现某个接口。这么做之后,实现接口的具体过程和继承一个仅包含抽象方法的抽象类是一样的。一个类可以同时继承一个父类和实现任意多个接口。 extends 子句应该在 implements 子句之前。 PHP 只支持继承自一个父类,因此 extends 关键字后只能跟一个类名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
interface iB 
    public function iBfunc1(); 
    public function iBfunc2(); 
class extends implements iA,iB 
    public function abstract_func1() 
    
       echo "implement the abstract_func1 in class A/n"
    
    public function abstract_func2() 
    
       echo "implement the abstract_func2 in class A/n"
    
    public function iAfunc1(){echo "in iAfunc1";} 
    public function iAfunc2(){echo "in iAfunc2";} 
    public function iBfunc1(){echo "in iBfunc1";} 
    public function iBfunc2(){echo "in iBfunc2";} 
   
class extends implements iA,iB 
    public function abstract_func1() 
    
       parent::abstract_func1(); 
       echo "override the abstract_func1 in class A/n"
    
    public function abstract_func2() 
    
       echo "implement the abstract_func2 in class A/n"
    
    public function iAfunc1(){echo "in iAfunc1";} 
    public function iAfunc2(){echo "in iAfunc2";} 
    public function iBfunc1(){echo "in iBfunc1";} 
    public function iBfunc2(){echo "in iBfunc2";} 

5 .接口不可以实现另一个接口,但可以继承多个

1
2
3
4
5
6
7
8
interface iC extends iA,iB{} 
class implements iC 
    public function iAfunc1(){echo "in iAfunc1";} 
    public function iAfunc2(){echo "in iAfunc2";} 
    public function iBfunc1(){echo "in iBfunc1";} 
    public function iBfunc2(){echo "in iBfunc2";} 

 

三、 抽象类和接口的异同

1. 相同点:

(1)      两者都是抽象类,都不能实例化。

(2)      interface 实现类及 abstract class 的子类都必须要实现已经声明的抽象方法。

2. 不同点:

(1)      interface 需要实现,要用 implements ,而 abstract class 需要继承,要用 extends 。

(2)      一个类可以实现多个 interface ,但一个类只能继承一个 abstract class 。

(3)      interface 强调特定功能的实现,而 abstract class 强调所属关系。

(4)      尽管 interface 实现类及 abstract class 的子类都必须要实现相应的抽象方法,但实现的形式不同。 interface 中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方法体 ) ,实现类必须要实现。而 abstract class 的子类可以有选择地实现。这个选择有两点含义: a) abstract class 中并非所有的方法都是抽象的,只有那些冠有 abstract 的方法才是抽象的,子类必须实现。那些没有 abstract 的方法,在 abstract class 中必须定义方法体; b) abstract class 的子类在继承它时,对非抽象方法既可以直接继承,也可以覆盖;而对抽象方法,可以选择实现,也可以留给其子类来实现,但此类必须也声明为抽象类。既是抽象类,当然也不能实例化。

(5)      abstract class 是 interface 与 class 的中介。 abstract class 在 interface 及 class 中起到了承上启下的作用。一方面, abstract class 是抽象的,可以声明抽象方法,以规范子类必须实现的功能;另一方面,它又可以定义缺省的方法体,供子类直接使用或覆盖。另外,它还可以定义自己的实例变量,以供子类通过继承来使用。

(6)      接口中的抽象方法前不用也不能加 abstract 关键字,默认隐式就是抽象方法,也不能加 final 关键字来防止抽象方法的继承。而抽象类中抽象方法前则必须加上 abstract 表示显示声明为抽象方法。

(7)      接口中的抽象方法默认是 public 的,也只能是 public 的,不能用 private , protected 修饰符修饰。而抽象类中的抽象方法则可以用 public , protected 来修饰,但不能用 private 。

3. interface 的应用场合

(1)      类与类之间需要特定的接口进行协调,而不在乎其如何实现。

(2)      作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。

(3)      需要将一组类视为单一的类,而调用者只通过接口来与这组类发生联系。

(4)      需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。

4. abstract class 的应用场合

一句话,在既需要统一的接口,又需要实例变量或缺省的方法的情况下,就可以使用它。最常见的有:

(1)      定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用 abstract class 定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。

(2)      某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。 abstract 的中介作用可以很好地满足这一点。

(3)      规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特 定的功能 。

转载于:https://www.cnblogs.com/axtkdd/p/4874715.html

相关文章:

React 父组件给子组件传值,子组件接收

父组件传值代码&#xff1a; render() {return (<div>{this.state.list?(<GeomLine list{this.state.list}/>):null}</div>);} 子组件接收代码&#xff1a; class GeomLine extends Component {// 在组件接收到一个新的 prop (更新后)时被调用。这个方法在…

unity 灯笼_如何创建将自己拼成文字的漂亮灯笼

unity 灯笼In this tutorial, we will go through how to create a group of festival lanterns that arrange themselves into the words you choose. An online demo can be found here.在本教程中&#xff0c;我们将介绍如何创建一组节日灯笼&#xff0c;这些灯笼将自己布置…

Android PackageManager packages.xml文件格式

packages.xml文件存放在/data/system目录下 该文件记录了系统中所有应用程序的包管理相关信息 PmS根据该文件进行包管理的各种操作 标签名称所包含的值举例last-platform-versioninternal"17" external"17"<permission-trees />暂时不使用<…

tplink wr886n v5.0 ttl 接线方法

我的倒是有ttl信息,但是全是乱码,换过RX和TX,也换过串口速率都没用,附上TTL接线图.2016-11-02今天晚上终于搞定了ttl了,步骤如下:1.先将串口波特率改为117500(推荐使用Putty).如果可以了就不用第二步了2.将usb转ttl转接板上的rx和tx的指示灯干掉,可以留下电源指示灯详细教程见s…

React子组件给父组件传值, 父组件引用子组件并给子组件传值

本博客代码是 React 父组件和子组件相互传值的 demo;实现封装一个折线图,折线图选择下拉框,获取下拉框点击的值并且传给父组件根据下拉框筛选的条件更新视图;效果图如下: 父组件代码: 代码解析:父组件 Parent 引用子组件 Sub ,传递了 list 组件给子组件,并且接收子组件…

我如何使用深度学习通过Fast.ai对医学图像进行分类

by James Dietle詹姆斯迪特尔(James Dietle) Convolutional Neural Networks (CNNs) have rapidly advanced the last two years helping with medical image classification. How can we, even as hobbyists, take these recent advances and apply them to new datasets? W…

Java——基础

1.数据类型 int&#xff0c;short&#xff0c;byte&#xff0c;long double&#xff0c;float char&#xff0c;String 2.变量 int var; var 12; int var1 12;final int v1 0; //常量 C/C变量的声明和定义是分开的&#xff0c;JAVA不区分。 //c/c extern int a; //声明 …

Gradle系列教程之依赖管理

这一章我将介绍Gradle对依赖管理的强大支持&#xff0c;学习依赖分组和定位不同类型仓库。依赖管理看起来很容易&#xff0c;但是当出现依赖解析冲突时就会很棘手&#xff0c;复杂的依赖关系可能导致构建中依赖一个库的多个版本。Gradle通过分析依赖树得到依赖报告&#xff0c;…

Ant Design Pro 登录流程以及路由权限设置

登录流程: 1.ant 框架最外层套了 SecurityLayout 布局 SecurityLayout 中判断用户是否登录,做自动跳转路由处理。 里面的 currentUser 和 currentUser.userid 很关键,是判断登录状态的值. 2.currentUser 是通过 src/models/user 中 fetchCurrent 绑定 type saveCurrentUs…

初级开发人员的缺点_这是我想放弃初级开发人员时所做的事情

初级开发人员的缺点Coding is hard. Really hard. There are times when you’ll think “this is amazing! I love this!”编码很难。 真的很难。 有时您会认为“这太神奇了&#xff01; 我喜欢这个&#xff01;” But you’ll also have the not so amazing times. The time…

C#之 HashSet(临时笔记,未参考资料,请慎重)

HashSet是一个集合&#xff0c;类似于DataSet,但是其主要用途是用来存放同一种类型的元素&#xff08;string、row、table等&#xff09;&#xff0c;如果添加的元素跟定义时初始的类型不一致&#xff0c;就会直接编译失败。 例如&#xff1a; HashSet<string> hsnew Has…

Ant Design of React从入门到开发教程

Ant Design Pro 是一个企业级中后台前端/设计解决方案。 目录: 一:开发前的准备 二:创建页面 三:创建组件并引用 四:封装网络请求和网络请求走向 五:登录流程以及路由权限设置 六:父组件和子组件相互传值和接收 七:for 循环渲染组件 Ant Design Pro 全家桶技术…

适合初学者的数据结构_数据结构101:数组-初学者的直观介绍

适合初学者的数据结构了解您每天使用的数据结构。 (Get to know the data structures that you use every day. ) Welcome! Let’s Start with some Vital Context. Let me ask you this: ✅ Do you listen to music on your smartphone?✅ Do you keep a list of contacts on…

少侠,找个千手观音来帮你营销可好?

亚历山大公司营销主管老张最近有点儿烦&#xff0c;不是因为老婆更年期、女儿叛逆期&#xff0c;而是工作遇到了些麻烦。 社交营销很火&#xff0c;老张自认为公司始终游走在新科技最前沿&#xff0c;当然在第一时间就开通了微信、微博、QQ……各种社交网络的一大堆账号&#x…

Upload上传图片

实现antd上传图片,Upload 组件可以上传多张图片,多张图片上传成功的效果图: 每次上传 onChange 回调函数都会执行一次并且里面接收一个JSON对象,其中 file 对象是本次上传的图片信息,status 值为 done 就表示这一次上传成功了,fileList 中是一个数组,里面是组件所有上传…

将html中的代码拷贝到jsp后出现的问题 Failed to create the part's controls

Failed to create the parts controls 解决方法&#xff1a; 在文件上右键:open with转载于:https://www.cnblogs.com/flyoung/p/4885921.html

面试官问你想找什么工作_找工作时如何面试面试官

面试官问你想找什么工作在技​​术面试中要问的十二个问题 (Twelve questions to ask at tech interviews) I’ve just come off six weeks’ of interviewing for medior software developer roles, in a market that is desperate for talent (Amsterdam). That means I went…

windows7 端口查看以及杀死进程释放端口

1、调出命令窗口&#xff1a;开始---->运行---->cmd&#xff0c;或者是windowR组合键 2、输入命令&#xff1a;netstat -ano&#xff0c;列出所有端口的情况。在列表中我们观察被占用的端口&#xff0c;比如是4300&#xff0c;我们拿它来做实验。 3、查看被占用端口对应的…

web-view 跳转小程序页面 网页跳转小程序

H5实现代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>测试H5</title><meta content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalable0" name"viewport…

MongoDB安装指南

0. 环境说明&#xff1a;Ubuntu 14.04, MongoDB2.6.1 1.输入MongoDB中public Key值到Ubuntu包系统中 2. 在Sources列表中创建MongoDB的文件 3. 又一次载入本地的文件包库列表 4. 安装MongoDB数据库 5. 启动MongoDB 6. 启动MongoDB shell,shell提供了一个类似SQLConsole的方式…

待办事项优先级 开发_如何通过创建主题待办事项确定学习内容的优先级

待办事项优先级 开发by Dan Draper通过丹德雷珀(Dan Draper) 如何通过创建主题待办事项确定学习内容的优先级 (How to prioritize what you learn by creating a topic backlog) 25年编码经验 (Lessons from 25 years of coding) Way back in 1994, I started learning how to…

Luogu P1087 FBI树

P1087 FBI树 题目描述 我们可以把由“0”和“1”组成的字符串分为三类&#xff1a;全“0”串称为B串&#xff0c;全“1”串称为I串&#xff0c;既含“0”又含“1”的串则称为F串。 FBI树是一种二叉树&#xff0c;它的结点类型也包括F结点&#xff0c;B结点和I结点三种。由一个长…

小程序 url 对象转字符串编码传参 url 字符串转对象解码接收参数

url 对象转字符串编码传参 let info encodeURI(JSON.stringify(this.data.info));wx.navigateTo({url: /pages/partner_reward/recognition_result/result?info info,}) url 字符串转对象解码接收参数 onLoad(options){let info JSON.parse(decodeURI(options.info));},

入职体检体检错了_我们如何更新入职体验并获得更多用户

入职体检体检错了by William Woodhead威廉伍德黑德(William Woodhead) 我们如何更新入职体验并获得更多用户 (How we updated our onboarding experience and got more users) 我们过去将转化率提高60&#xff05;的方法 (Methods we used to increase conversion by 60%) As …

Java集合框架:EnumMap

EnumMap定义 package java.util;import java.util.Map.Entry; import sun.misc.SharedSecrets; public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V>implements java.io.Serializable, Cloneable{private final Class<K> keyType;p…

javascript eval和JSON之间的联系

eval函数的工作原理 eval函数会评估一个给定的含有JavaScript代码的字符串&#xff0c;并且试图去执行包含在字符串里的表达式或者一系列的合法的JavaScript语句。eval函数将把最后一个表达式或者语句所包含的值或引用作为返回值。 举例说明 eval评估JavaScript表达式var bar …

notification antd 弹窗使用示例

示例代码 import { notification } from antd;notification.error({description: 您的网络发生异常&#xff0c;无法连接服务器,message: 网络异常,});

python如何编写数据库_如何在几分钟内用Python编写一个简单的玩具数据库

python如何编写数据库MySQL, PostgreSQL, Oracle, Redis, and many more, you just name it — databases are a really important piece of technology in the progress of human civilization. Today we can see how valuable data are, and so keeping them safe and stable…

齐博cms 7.0 漏洞分析

** 0x01 原理分析 ** 还是很早之前爆出来的漏洞&#xff0c;现在拿出来学习一下&#xff0c;参考阿里巴巴&#xff1a;https://security.alibaba.com/... 漏洞发生在/inc/common.inc.php页面中。首先看这个函数&#xff1a; 首先使用ini_get来获取php.ini中变量register_global…

J2EE 中的服务器 tomcat6.0 配置

Tomcat6.0 配置 第一步&#xff1a;下载jdk和tomcat&#xff1a;JDK下载 Tomcat下载 最新的jdk为1.6.10&#xff0c;tomcat为6.0&#xff0c;建议jdk1.4以上&#xff0c;tomcat4.0以上 第二步&#xff1a;安装和配置你的jdk和tomcat&#xff1a;执行jdk和tomcat的安装程序…