先说自己的看法
- 几点
- 含有抽象方法的类一定是抽象类
- 抽象类不一定含有抽象方法
- 抽象类中可以有普通的方法
- 抽象类不能直接实例化,必须由一个子类继承它。并把所有父类中的抽象方法都实现(重写),新的实现方法的参数的个数应该和抽象方法的参数个数一样,重新生成对应的类型提示。
abstract class person{
//定义抽象方法:修饰词:abstract 方法是没有方法体的
public abstract function say($name);
public abstract function run();
public function eat(){
echo 'eat...';
}
}
class student extends person{
public function say($name){
echo "{$name}say...";
}
public function run(){
echo 'run...';
}
}
$student = new student ();
$student -> say('lisi');
echo "<hr />";
$student -> eat();
- 几点
- 接口 声明关键字 interface
- 接口中可以声明常量也可以声明抽象方法
- 接口中的方法都是抽象方法不需要使用abstract修饰
- 接口不能实例化,需要用一个类去实现它(implements)
- 一个类可以实现多个接口(解决了php单继承的问题)
interface person{
const Name='lwb';
public function run();
public function say();
}
interface learn{
public function study();
}
class student implements person,learn{
public function run(){
echo 'run...';
}
public function say(){
echo 'say...';
}
public function study(){
echo 'study...';
}
}
$student = new student();
$student -> run();
echo "<hr />";
echo $student::Name."<hr />";
$student -> say()
echo "<hr />";
$student -> study();
下面是面试题中网络答案所见
- 接口用于规范,抽象类用于共性。
- 接口中只能声明方法,属性,事件,索引器。而抽象类中可以有方法的实现,也可以定义非静态的类变量。
- 抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。
- 抽象类可以提供某些方法的部分实现,接口不可以.
- 抽象类的实例是它的子类给出的。接口的实例是实现接口的类给出的。
- 再抽象类中加入一个方法,那么它的子类就同时有了这个方法。而在接口中加入新的方法,那么实现它的类就要重新编写(这就是为什么说接口是一个类的规范了)。
- 接口成员被定义为公共的,但抽象类的成员也可以是私有的、受保护的、内部的或受保护的内部成员(其中受保护的内部成员只能在应用程序的代码或派生类中访问)。
- 此外接口不能包含字段、构造函数、析构函数、静态成员或常量