PHP中抽象类abstract和接口interface的区别
abstract类
1、关于抽象类
1) 抽象类必须有关键字abstract来修饰,抽象类中可以不含有抽象方法,如果一个类包含抽象方法,则该类必须是抽象类。
2) 抽象类不能被直接实例化,它的意义在于被扩展(extends)
2、关于抽象类中的方法
1) 抽象方法中没有大括号。
2) 只要方法没有用abstract声明,在其子类中就不用实现。而且在子类中该方法为公共方法。子类中可以重载这些方法。
3) 抽象类中的方法可以有参数,也可以为空。如果抽象方法有参数,那么子类的实现也必须有相同的参数个数。
4) 只要方法没有用abstract声明,在其子类中就不用实现。而且在子类中该方法为公共方法。
5) 如果子类需要实例化,前提是它继承(extends)了该抽象类。实现了抽象类中的所有抽象方法,否则,子类也要用abstract标识为抽象类。
6)抽象方法是必须可以被子类继承实现的,所以不可以用private修饰符去限定abstract抽象方法,可以用public和protected去修饰。
作用:
1)当我们发现我们写的很多类里面用很多方法都是不断在重复写,那我们就可以考虑使用抽象类了。比起去重写一个公共类,每次调用相应方法之前必须得实例化这个类。使用抽象类省去了实例化的这个步骤,让我们就像直接调用本类方法一样方便,而且还可以重载这个方法。
2)跟继承普通类的区别,抽象类可以把类像的部分抽出来,只需要声明抽象方法,不会具体实现。待子类继承后根据具体业务自行去实现。
参考代码:
1 <?php 2 3 4 abstract class User 5 { 6 abstract public function findIdentity($id); 7 8 abstract protected function getAuthKey(); 9 10 public function getName($name) 11 { 12 echo $name; 13 } 14 15 public function getId() 16 { 17 echo 123; 18 } 19 } 20 21 abstract class User1 extends User 22 { 23 public function findIdentity($id) 24 { 25 echo $id; 26 } 27 } 28 29 class User2 extends User 30 { 31 public function findIdentity($id) 32 { 33 echo $id; 34 } 35 36 public function getAuthKey() 37 { 38 echo 'test'; 39 } 40 41 } 42 43 $user2 = new User2(); 44 $user2->getId(); 45 //结果输出: 123
interface类
1)接口类就是一个类的领导者,指明方向,子类必须完成它指定方法。
2)定义了一个接口类,它里面的所有方法其子类必须实现。接口是类的一个模板,不能被直接实例化。其子类必须实现(implements)接口中定义的所有方法。
作用:当有很多人一起开发一个项目时,可能都会去调用别人写的一些类。如何知道别人是如何给相应功能的实现方法命名?这个时候接口类就发挥作用啦~
参考代码:
1 <?php 2 3 interface User 4 { 5 6 public function getName($name); 7 8 public function getAge($age); 9 10 } 11 12 class MyUser implements User 13 { 14 15 public function getName($name) 16 { 17 echo $name; 18 } 19 20 function getAge($age) 21 { 22 echo $age; 23 } 24 25 }
abstract与interface的区别
1、抽象类需要继承,用extends,而接口需要实现,用implements
2、一个类可以实现多个接口,但只能继承一个抽象类(PHP只支持单继承)
3、接口中每个方法都只有声明而没有实现,其中每个接口的子类都必须要实现接口中的所有方法。而抽象类中, 只要方法没有用abstract声明,在其子类中就不用实现。另外,如果子类不需要实例化,也可以不用全部实现抽象类中的抽象方法。
4、接口中只能声明public的方法,不能声明private和protected的方法,不能对方法进行具体实现,也不能声明实例变量。抽象类也不能用private,但是可以用protected或者public来声明方法。