接口是规范,类是实现。
抽象类
定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的(抽象类可以没有抽象方法,但抽象类依然不能被实例化)。被定义为抽象的方法只是声明了其调用方式(参数),不能实现其具体的功能。
abstract class Abstractclass{
//抽象方法
abstract protected getValue();
//普通方法
public function printOut(){
echo "bilingbiling";
}
}
继承一个抽象类的时候,非抽象子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中的一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,子类中的实现方法就应声明为受保护或者公有。此外,方法的调用方式也必须匹配,即类型和所需参数数量一致。
抽象类可以有成员属性,抽象方法不能被定义为私有。
抽象类可以实现接口,且可以不实现其中的方法。
抽象类可以继承抽象类,但不能重写抽象父类的抽象方法,这样的方法可以理解为抽象类的扩展。
abstract class Human{
abstract function eat();
}
abstract class Student extends Human{
abstract funciton study();
}
接口
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口通过关键字 interface 定义,就像定义一个标准类一样,但其中定义所有的方法都是空的。接口类中定义的方法都必须是公有的。
常量:接口中可以定义常量,但不能被子类或者子接口覆盖。
interface Play{
const a = 100;
public function toy();
}
接口实现:要实现一个接口,使用 implements 操作符,非抽象类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。类要实现接口,必须使用和接口中所定义的方法完全一致的方式。
类可以同时继承抽象类和实现接口,extends 要写在前面。
抽象类实现接口,不需要重写其中的方法。
实现多个接口时,接口中的方法不能有重名。
interface Play{
const a = 100;
public function toy();
}
interface Read{
public function readBook();
}
abstract class Human{
abstract function eat();
}
abstract class Student extend Human implements Play, Read{
abstract function study();
}
接口也可以继承一个或多个接口,使用 extends 关键字,多个接口用逗号隔开,但不能实现另一个接口,不能继承抽象类。
interface Play{
public function playGame();
}
interface PlayNew{
public function playNew();
}
interface Plays extends Play, PlayNew{
public function playCytus();
}
总结
抽象类一般用来定义一类实体是什么,包含的属性,抽象方法和非抽象方法。接口用来定义一类实体能做什么。
网友评论