抽象类与接口
抽象类的实际意义: 抽象类是类的模板。当你发现很多类的某些方法在不断重复写,这时可以考虑使用抽象类。
抽象类的特点:
- 类前加 abstract 是抽象类(如:abstract class lijian)。
- 方法名前加 abstract 是抽象方法(如:abstract public function show(){} )。
- 抽象类不能被实例化,只可以被继承,它的意义在于被扩展。
- 当一个类继承自一个抽象类时,此类继承过来的抽象方法必须一一实现。否则同样无法实例化。
- 抽象类中不光可以抽象方法,也可以有普通方法。
- 抽象类的方法可以有参数,也可以为空, 如果抽象方法有参数,那么子类的实现也必须有相同的参数个数 。
- 方法的权限必须是public
接口的实际意义: 当多人协作开发,需要调用别人的类,我如何知道某个功能的实现方法是怎么命名呢?这时候用接口就很方便了。因为类继承接口时,接口的方法必须一一实现。
接口的特点:
- 接口的方法必是抽象方法,所以不能用方法体
- 一个类可以继承多个接口 class lijian implements one,two,three
- 接口可以被继承,用extends
- 接口方法的权限必须是public
- 接口不能有属性,可以用常量
抽象类和接口的区别
接口是一个特殊的抽象类,也可以看作是一个模型的规范。接口与抽象类大致区别如下:
- 一个子类如果implements一个接口,就必须实现接口中的所有方法(不管是否需要);如果继承一个抽象类,只需要实现需要的方法即可
- 如果一个接口中定义的方法名改变了,那么所有实现此接口的子类需要同步更新方法名;而抽象类中如果方法名改变了,其子类对应的方法名将不受影响,只是变成了一个新的方法而已
- 抽象类只能单继承,当一个子类需要实现的功能需要继承多个父类时,就必须使用接口
代码示例
<?php //抽象类 abstract class Flyidea { //抽象方法 abstract public function engine(); //普通方法 public function echo123(){ echo 123; } } //继承抽象类 class lijian extends Flyidea { //将继承的抽象方法实现。 public function engine(){ echo '实现了'; } } ?>
<?php //接口 interface love { public function a(); } interface test extends love { public function b(); } //继承接口 class lijian implements test { public function a(){} public function b(){} } ?>