php抽象类和接口的区别

tags:抽象类 接口 抽象类和接口 php


引言:这是一个面试经常被问到的问题,也是一个经典问题。我们尽量引用官方权威的说明或者经过实验来证明本文所说的内容准确性。

抽象类

官方描述请查看文档,下面是官方描述的梳理版本:

  • 定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。(抽象类可以没有抽象方法,但是抽象类依然不能被实例化)被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。 如
abstract class  AbstractClass
{
// 强制要求子类定义这些方法,且不能定义具体功能 注意没有大括号{}
abstract protected function getValue ();
abstract protected function prefixValue ( $prefix ); // 普通方法(非抽象方法)
public function printOut () {
print $this -> getValue () . "\n" ;
}
}
  • 继承一个抽象类的时候,非抽象子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。
  • 此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数(类似function eat($a,$b=1)中的$b就是可选参数),而父类抽象方法的声明里没有,则两者的声明并无冲突。这也适用于 PHP 5.4 起的构造函数。在 PHP 5.4 之前的构造函数声明可以不一样的。

补充:

  1. 抽象类可以有成员属性。
  2. 有人问:抽象方法是否可以定义为私有,答案是不可以,因为抽象接口的目的就是为了抽象出类模型用来继承,定义为私有,外部访问不到,偏移了设计目的。如下会报错
  3. 抽象类可以实现接口,且可以不实现其中的方法(后面接口的实现中有代码)
```php

abstract class Sutdent extends Human
{
abstract private function study();
} ```

Fatal error: Abstract function Sutdent::study() cannot be declared private in D:\11\index.php on line 10

  1. 抽象类可以继承抽象类,且不能重写抽象父类的抽象方法。这样的用法,可以理解为对抽象类的扩展。如

abstract class Human
{
abstract function eat();
} abstract class Sutdent extends Human
{
abstract function study();
//abstract function eat(); 若重写抽象父类的抽象方法eat()会报错
}

若重写抽象父类的抽象方法则报以下错误

Fatal error: Can't inherit abstract function Human::eat() (previously declared abstract in Sutdent) in D:\11\index.php on line 11

接口

1. 接口的定义

  • 使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
  • 接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
  • 接口中定义的所有方法都必须是公有,这是接口的特性,protected和private会报错(Fatal error: Access type for interface method)。
  • 常量:接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。(不建议这样用,实在想不到有什么意义,也容易产生和抽象类的混淆)

interface Play
{
const LEVEL=10;
public function PlayLOL();
public function PlayFootball();
}

2. 接口的实现

要实现一个接口,使用 implements 操作符。非抽象类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。

补充:

  • 可以同时继承抽象类和实现接口,extends要写在前面.
  • 抽象类实现接口,不需要重新其中的方法。
  • 实现多个接口时,接口中的方法不能有重名。
  • 接口也可以继承,通过使用 extends 操作符。
  • 类要实现接口,必须使用和接口中所定义的方法完全一致的方式。否则会导致致命错误。

interface Play
{
const LEVEL=10;
public function PlayLOL();
public function PlayFootball();
} interface Read
{
public function ReadNovel();
} abstract class Human
{
abstract function eat();
}
//抽象类可以实现接口后不实现其方法,可以继承一个抽象类的同时实现多个接口注意必须要把extends语句写在implements前面,否则会报错
abstract class Sutdent extends Human implements Play,Read
{
abstract function study();
}

3. 接口的继承

接口可以继承另一个或多个接口,使用extends关键字,多个用 ',' 隔开,但是不能实现另一个接口,当然更不能继承抽象类(继承抽象类报错:Fatal error: PlayGame cannot implement Human - it is not an interface in D:\11\index.php on line 10


interface Play
{
public function PlayFootball();
}
interface PlayNew
{
public function PlayFootballNew();
} interface PlayGame extends play,PlayNew
{
public function PlayLOL();
}

总结

一般都在这里写相同点和不同点,我偏不写,嘿嘿,因为我觉得上面写的够详细了。

我们简单总结一句:抽象类一般用来定义一类实体是什么,他包含了属性,抽象方法和非抽象方法。接口用来定义一类实体能做什么,一般认为他只有抽象方法,常量极少用到。

php抽象类和接口的区别的更多相关文章

  1. java抽象类与接口的区别及用法

    java抽象类与接口的区别及用法 一.抽象类里面的方法可以有实现,但是接口里面的方法确是只能声明. 二.接口是设计的结果 :抽象类是重构的结果 . 三.java不支持多重继承,所以继承抽象类只能继承一 ...

  2. 转:二十一、详细解析Java中抽象类和接口的区别

    转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...

  3. java基础之抽象类与接口的区别

    在学习java的过程中,或者是在找工作笔试或面试的时候,如果你是java岗位,那么抽象类与接口的区别无疑是一个大热点,是各大公司都想要考的一个小知识点,下面是我为了9月份秋招自己总结的,若有不对的地方 ...

  4. Java基础知识强化18:抽象类、接口的区别 和 选择性实现接口方法

    1.抽象类和接口的区别 抽象类里面可以有非抽象的方法(可以没有抽象方法),接口里只能有抽象方法. 抽象类中的抽象方法声明时不能有大括号,而接口中的所有方法都没有大括号.  抽象类(abstract c ...

  5. java 抽象类与接口的区别 整理

    抽象类与接口的区别 抽象类 包含抽象方法的类就是抽象类,声明的语句:abstract class 必须是public protected 接口 对行为的抽象,声明语句:interface 抽象方法的修 ...

  6. C#中抽象类和接口的区别

    原文:C#中抽象类和接口的区别 大家在编程时都容易把抽象类和接口搞混,下面为大家从概念上讲解抽象类和接口的区别: 一.抽象类: 含有abstract修饰符的class即为抽象类,抽象类是特殊的类,只是 ...

  7. C#抽象类与接口的区别

    一.抽象类:抽象类是特殊的类,只是不能被实例化(可以用派生类实例化基类对象):除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法(当然它可以有普通方法),这是普通类所不能的.抽象方法只能声明于 ...

  8. java 中的重载与重写 抽象类与接口的区别

    . 重载与重写的区别: 重载(overload)               | 重写(override) 1 方法的名称相同,参数个数.类型不同 | 方法名称.参数列表.返回值类型与父类完全相同 2 ...

  9. C#中抽象类与接口的区别

    1.面向接口编程和面向对象编程是什么关系 首先,面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分.或者说,它是面向对象 ...

随机推荐

  1. [ZJOI2006]书架(树状数组水过)

    这道题显然平衡树,splay,treap什么的随便切 然而我不想打,决定水过这道题 把空间开3倍,树状数组维护它前面的树的个数,开个id数组记录位置 找一个数排名直接二分加求前缀和,log^2的搞一搞 ...

  2. 某厂java算法题实现及改进【有n个人成一圈,顺序排号(编号为1到n),从第一个人开始报数1到3报数】

    一.第一种实现: 实现比较简单,直接贴现成的代码了,第一种实现: /** * 总人数 * * @param d */ private static void sortQuerry1(int d) { ...

  3. mininet中加载ECN

    今天捣鼓了一上午,中午把ECN部署到mininet中了,简单记录下加载过程: 加载前搜索了全网,找到了一个有用的参考网页:https://groups.google.com/a/openflowhub ...

  4. 解决Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project autotest_fchtgl: Compilation failure的方法

    在碰到maven install 发现报错 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.2:comp ...

  5. selenium webdriver 的环境搭建时注意事项

    selenium webdriver 在 eclipse中的配置,网络上应该很方便搜索到,这里只记搭建过程中容易出现的一些问题 1.  selenium-java与selenium-sever-sta ...

  6. jmeter--简单的接口测试(GET/POST)

    最近在学习接口测试,本文就简单的谈一谈对接口相关知识的理解. 一.什么是接口? 程序接口:由一套陈述.功能.选项.其它表达程序结构的形式.以及程序师使用的程序或者程序语言提供的数据组成(百度百科定义) ...

  7. load vs. initialize

    这篇文章来对比一下NSObject类的两个方法,+load与+initialize. + (void)load; Invoked whenever a class or category is add ...

  8. 用session做权限控制

    一个需要用户进行登录的网站,基本上都会设置用户权限,对不同的用户进行权限控制.例如:一个网站肯定会有一个管理员管理着普通的用户,普通的用户不可能对其他用户有着类似于增删改查等操作,这样网站都乱了--, ...

  9. 兼容的Ajax

    /** * 创建XMLHttpRequest对象 * @param _method 请求方式: post||get * @param _url 远程服务器地址 * @param _async 是否异步 ...

  10. java 日期格式处理

    Java 日期时间 Date类型,long类型,String类型表现形式的转换 1.java.util.Date类型转换成long类型java.util.Date dt = new Date();Sy ...