抽象类php5支持抽象类和抽象方法。如果在一个类前加上abstract,这个类就变成了抽象类,不能被实例化。这个类天生就是继承的,为子类提供一个类的模板;在类方法前加abstract就是抽象方法,抽象方法不能有方法体;综上所述,抽象类具有以下特点:如果一个类中有抽象方法,则该类必须是一个抽象类;否则会报错;抽象类中的方法不一定是抽象方法;判断一个类是否可以被实例化取决于它是否是一个抽象类。即使类中的所有方法都是具体方法,类本身是抽象方法,也无法实例化。所有的抽象类都有具体的方法,但是抽象类不能被实例化,想使用其中的具体方法,可以通过继承或者通过类来调用;抽象类作为继承类,所以方法必须是public或者protected,而子类又因为继承父类的规则,不能让它的权限越来越严格,它的子类也必须是public或者protected;如果一个非抽象类继承了一个抽象类,那么抽象类中的所有抽象方法都必须完成(并且参数和它们的参数类型必须相同),但是如果一个抽象类继承了一个抽象类,则不需要完成抽象类中的抽象方法(抽象类继承抽象类的目的是对继承的抽象类进行扩展);以下代码摘自严十八公益课堂/*春秋战国时期,严令期是飞行专家,也是能工巧匠。他写了一个蓝图——飞机制造艺术。他的孙子问:如何制造发动机?燕灵琪看着落日:我造不出来,但我相信未来有人能造出来。只能在图纸中使用,不能实例化。***///这个时候这个类没有具体的方法实现,太抽象了。//所以我们把它做成一个抽象类abstractclassFlyIdea{//强大的引擎,当时做不到,这个方法实现不了,所以方法也是abstractpublicabstractfunctionengine();//平衡舵publicabstractfunctionblance();/*注意:抽象方法不能有方法体下面写成如下Wrongpublicabstractfunctionblance(){}Fatalerror:AbstractfunctionFlyIdea::engine()cannotcontainbody*/}/*抽象类不能用new实例化$kongke=newFlyIdea();不能实例化抽象类FlyIdea*///明代万户用火箭解决发动机问题。abstractclassRocketextendsFlyIdea{//万户实现了engine方法,不再抽象。publicfunctionengine(){echo'点燃火药,失去平衡,砰!
';}//但是万户不能实现平衡舵,所以平衡舵对于Rocket类来说还是抽象的,类也是抽象的//这里,由于父类的继承也是一个抽象类,所以是没必要完成抽象类里面所有的抽象方法;}/*在现代,严十八亲手在Fly类中做了飞机,所以抽象方法都实现了,不再是梦想。*///当你到达这个类时,你必须完成所有的抽象方法;classFlyextendsRocket{publicfunctionengine(){echo'powerfulthrow
';}publicfunctionblance(){echo'两只纸翅膀保持平衡~~~';}publicfunctionstart(){$this->engine();对于($i=0;$i<10;$i++){$this->blance();echo'平衡
';}}}$apache=newFly();$apache->开始();接口接口是PHP对象之间的契约。由抽象方法和静态常量定义的集合接口是一个特殊的抽象类,它只包含抽象方法和静态常量。界面中没有其他类型的内容。总结如下:接口是对某一类事物的功能的抽象。方法本身默认都是抽象的,不能有方法体;一绝。当然,除了这些包括接口的方法外,还可以添加其他的方法;接口可以被继承。接口是一堆方法的描述,不能添加属性,但是可以定义常量。定义的常量不能被覆盖,访问方法是接口。name::constantname或self::constantname接口的方法必须是public;class可以实现多个接口8");/*Class:是对某类事物的抽象,是某类事物的蓝图。例如:女娲造人时,她心目中的人类就是人类类人类如果说,当女娲决定造人的时候,在形象还没有定型的同时,她脑子里还有哪些碎片化的形象呢?她可能会这样想:动物:吃猴子:跑猴子:哭自己:想鸟:飞类是对一个事物/动物的抽象,那么接口就是对这个事物/动物的功能的抽象,也就是把它们的功能分开自由组合成小块,组成一个新的特殊类型*/;interfaceanimal{constNAME='zxg';//不能定义属性,但可以定义常量;publicfunctioneat();}interfacemon关键{公共功能运行();公共功能哭泣();}interfacewisdom{publicfunctionthink();}接口鸟{公共函数fly();/*如上,我们把各个类实现的功能分开分析:如果有一个新的Creatures实现eat()+run()+cry()+think(),这个智能生物就可以称为人类。类人类实现entsanimal,monkey,wisdom{}Human类必须包含animal,monkey,wisdom接口中的方法,缺一不可,否则会报错ClassHumancontains4abstractmethods*/classHumanimplementsanimal,monkey,wisdom,bird{//这里的接口数量可以随意增加;增加后,该类中的方法必须在接口中有新添加的方法publicfunctioneat(){echo"eatingmethod";}publicfunctionrun(){echoself::NAME;//任何接口定义的常量都可以通过self访问;echo'步行法';}publicfunctioncry(){echo'哭法';}publicfunctionthink(){echoanimal::NAME;//也可以通过接口名来呼应'思维方式';}publicfunctionsmile(){echo"这是一个新添加的微笑方法";}publicfunctionfly(){echo"这是bird中新增的接口fly方法";}}$obj=newHuman();$obj->思考();?>接口的使用是通过关键字implements和抽象类的使用是通过关键字extends之间的区别。当然也可以通过关键字extends来继承接口,但是最好通过implements来实现。接口中不能声明成员变量(包括类静态变量),但可以声明类常量。抽象类中可以声明各种类型的成员变量,实现数据封装。接口只有抽象方法,没有具体方法,而抽象类可以有具体方法。接口中的方法默认是public的,抽象类中的方法可以修饰成protected或者public(其实抽象类也可以声明私有方法,只是没有意义)。一个类可以同时实现多个接口,但是一个类只能继承一个抽象类。使用接口还是抽象类?如果你想创建一个将被一些密切相关的对象采用的模型,你可以使用抽象类。当您想要创建将被一些不相关的对象采用的功能时,将使用接口。如果必须从多个来源继承行为,请使用接口(只有接口可以继承多个来源)。如果您知道所有类都将共享一个公共行为实现,请使用抽象类并在其中实现该行为。应用场景举例更多的应用场景可以参考一些国外的框架,比如YII
