1.理解
抽象类:比如男人,女人这两个类,那我们可以为这两个类设计一个更高级别的抽象类 人。
接口:我们可以坐着吃饭,可站着吃饭,可以用筷子吃饭,那么可以把这些吃饭的动作抽象成一个接口 吃饭
一个类只能继承一个抽象类(因为你不可能同时是生物又是非生物)。
但是
一个类可以同时实现多个接口,比如开车接口,滑冰接口,踢足球接口,游泳接口。
总结
abstract是向上提取一个共性 interface是给一个事物对象提供多个解决问题的方法。
2.区别
1.接口类用implements,抽象类用extends.
2.变量类型 :接口类中不可以含有成员变量/静态变量,可以类常量。抽象类中可以声明各种类型成员变量,实现数据封装。
3.构造函数 接口类没有构造函数,抽象类可以有构造函数。
4.方法权限 接口类中默认的方法都是public类型的,而抽象类可以public/protected/private
5.几个 一个类可以有多个接口,一个类只能有一个抽象类。
6.执行
接口里面的方法也必须全部被子类实现,如果子类不能实现那么子类必须是抽象类。
抽象类里面的抽象方法必须全部被子类实现,如果子类不能全部实现,那么子类必须也是抽象类。
7.抽象
抽象类里面可以没有抽象方法。
如果一个类里面有抽象方法,那么这个类一定是抽象类。
接口(类)可以继承接口,甚至可以继承多个接口。但是类只能继承一个类。
8.实例化 抽象类和接口都不能被直接实例化
4.代码
<?php
abstract class Father {
function meth1() {
echo "meth1...<br>";
}
abstract function meth2();
public $var1="var1";
public static $var2="var2";
const Var3="Var3";
}
class Son extends Father {
function meth2() {
echo "meth2 of Son...<br>";
}
}
$s=new Son();
echo $s->var1."<br>";
echo Father::$var2."<br>";
echo Father::Var3."<br>";
Interface IFather {
//public $iVar1="iVar1"; 此处接口定义中不能包含成员变量
//public static $iVar2="iVar2"; 此处接口定义中不能包含静态变量
const iVar3="iVar3";
function iMeth1();
}
Class ISon implements IFather {
function iMeth1() {
echo "iMeth1...<br>";
}
}
$is=new ISon();
echo IFather::iVar3;
?>
5.图示
6.选择
1.多个源的话,就要用接口
2.方法共享话,就要用抽象
3.紧密相关的话就用抽象类,相关性不大就用接口类。 抽象类的功能应该要远多于接口,但是定义抽象类的代价较高。因为高级语言一个类只能继承一个父类,即你在设计这个类的时候必须要抽象出所有这个类的子类所具有的共同属性和方法;但是类(接口)却可以继承多个接口,,因此每个接口你只需要将特定的动作方法抽象到这个接口即可...也就是说,接口的设计具有更大的可扩展性,而抽象类的设计必须十分谨慎