PHP中的抽象类(abstractclass)和接口(interface)有什么区别?让我们看看具体的说明。一、抽象类和接口的异同1、相同点:(1)都是抽象类,都不能被实例化。(2)接口实现类和抽象类的子类都必须实现声明的抽象方法。2.区别:(1)、接口需要实现,使用implements,抽象类需要继承,使用extends。(2)、一个类可以实现多个接口,但一个类只能继承一个抽象类。(3)、接口强调具体功能的实现,而抽象类则强调所有权关系。(4)虽然接口实现类和抽象类的子类都必须实现相应的抽象方法,但实现形式不同。接口中的每一个方法都是一个抽象方法,只是一个声明(declaration,nomethodbody),实现类必须实现它。抽象类的子类可以有选择地实现它。这种选择有两个含义:a)抽象类中的方法并非都是抽象的,只有那些标记为抽象的方法才是抽象的,子类必须实现它们。对于没有abstract的方法,方法体必须定义在抽象类中;b)当抽象类的子类继承它时,可以直接继承或重写非抽象方法;对于抽象方法,你可以选择自己实现也可以交给它的子类来实现,但是这个类也必须声明为抽象类。既然是抽象类,当然不能实例化。(5)、抽象类是接口和类的中介。抽象类起着连接接口和类的作用。一方面,抽象类是抽象的,可以声明抽象方法来规范子类必须实现的功能;另一方面,它可以定义默认方法体以供子类直接使用或覆盖。此外,它还可以定义自己的实例变量,通过继承的方式供子类使用。(6)接口中的abstract关键字之前不需要也不能加。默认隐式是抽象方法,不能加final关键字,防止抽象方法的继承。在抽象类中,必须在抽象方法前加上abstract,表示声明的是抽象方法。(7)接口中的抽象方法默认是public的,而且只能是public,不能用private或protected修饰符修饰。抽象类中的抽象方法可以修饰为public和protected,不能修饰为private。3、接口的应用场合(1)、类与类之间需要一个特定的接口来协调,不管它是如何实现的。(2)作为可以实现特定功能的标识符存在,也可以是不具有任何接口方法的纯标识符。(3)需要将一组类看成一个单独的类,调用者只通过接口联系这组类。(4)需要实现多个特定的功能,而这些功能之间可能根本没有联系。4.抽象类的应用总之,当既需要统一接口又需要实例变量或默认方法时可以使用。最常见的有:(1)定义一组接口,但不想强制每个实现类都实现所有的接口。一个抽象类可以用来定义一组方法体,甚至是一个空的方法体,然后子类就可以选择自己感兴趣的方法来覆盖。(2)在某些场合下,类之间的协调不能仅靠纯接口来满足,需要类中表示状态的变量来区分不同的关系。抽象的中介作用可以很好地满足这一点。(3)规定了一组协调的方法,其中一些方法是通用的、状态无关的、可共享的,不需要子类单独实现;而其他方法需要每个子类根据自己的特定状态来实现。实现特定的功能。二、抽象类abstractclass1。抽象类是指在类前面加上abstract关键字,并且有抽象方法(abstract关键字在类方法function关键字前面)的类。2.抽象类不能直接实例化。在抽象类中只定义(或部分实现)子类所需的方法。子类可以通过继承抽象类并实现抽象类中的所有抽象方法来使抽象类具体化。3、子类如果需要实例化,前提是它实现了抽象类中的所有抽象方法。如果子类没有实现抽象类中的所有抽象方法,那么子类也是一个抽象类,必须在类前面加上abstract关键字,不能实例化。abstractclassA{/**抽象类中可以定义变量*/protected$value1=0;私人$value2=1;公共$value3=2;/**也可以定义非抽象方法*/publicfunctionmy_print(){echo"hello,world/n";}/***大多数情况下,一个抽象类至少包含一个抽象方法。抽象方法是用abstract关键字声明的,不能有具体的内容。*抽象方法可以像普通类方法一样声明,但以分号结束而不是方法体。也就是说,抽象类中不能实现抽象方法,即没有函数体“{somecodes}”。*/抽象保护函数abstract_func1();abstractprotectedfunctionabstract_func2();}abstractclassBextendsA{publicfunctionabstract_func1(){echo"implementtheabstract_func1inclassA/n";}/**这个在zendstudio写的8会报错*///abstractprotectedfunctionabstract_func2();}classCextendsB{publicfunctionabstract_func2(){echo"implementtheabstract_func2inclassA/n";}}三、接口interface1。抽象类为具体实现提供标准,而接口是纯模板。接口仅定义功能,而不定义实现的内容。接口是用关键字interface声明的。2.接口是完全抽象的。它只能声明方法,而且只能声明公共方法。不能声明私有和保护方法,不能定义方法体,不能声明实例变量。但是,接口可以声明常量变量。但是把常量变量放在interface里面就违背了它作为interface存在的目的,也混淆了interface和class的不同取值。如果确实需要,可以放到相应的抽象类或Class中。接口iA{constAVAR=3;公共功能iAfunc1();公共功能iAfunc2();}echoiA::AVAR;详见原文:PHP中的抽象类(abstractclass)与接口(interface)注:本文为转载,原文地址:PHP中的抽象类(abstractclass)与接口(interface)
