PHP接口和抽象类用示例加以说明。
1。抽象类是指在类之前添加抽象关键字的类和抽象方法的存在(抽象关键字被添加到类方法函数关键字)。
2。抽象类不能被直接实例化。一个方法定义唯一的(或部分实现)在抽象类的子类,子类可以继承抽象类的抽象类实现所有的抽象方法的实现。
三.如果子类需要实例化,前提是它在抽象类中实现所有抽象方法。如果子类没有在抽象类中实现所有抽象方法,子类也是抽象类。必须在向类添加抽象关键字之前。
复制代码代码如下所示:
一个抽象类
{
抽象类可以定义变量。
保护值= 0美元;
私人value2 = 1美元;
公共值= 2美元;
*也可以是非抽象方法定义。
公共功能my_print()
{
你好,世界;
}
*在大多数情况下,抽象类至少包含一个抽象方法。
*您可以声明一个抽象方法,如一个公共类方法,但以一个分号结束,而不是一个方法体,也就是说,抽象方法不能在抽象类中实现,也就是说,没有函数体{一些代码}。
* /
摘要保护功能abstract_func1();
摘要保护功能abstract_func2();
}
抽象类B扩展了
{
公共功能abstract_func1()
{
回声的abstract_func1班 / 的实施;
}
写在Zend Studio / * 8在错误。
/ /摘要保护功能abstract_func2();
}
类扩展B
{
公共功能abstract_func2()
{
回声实施abstract_func2班 / ;
}
}
4。如果子类B继承了抽象方法如下,abstract_func()不落实:
复制代码代码如下所示:
类B扩展{ };
然后程序将有以下错误:
复制代码代码如下所示:
致命错误:B类包含1个抽象方法,因此必须声明
5、如果B实现抽象方法abstract_func(),然后abstract_func访问控制()方法B不比abstract_func访问控制更严格的()中的一种,也就是说:
(1)如果abstract_func()在一个声明为公共的,那么abstract_func宣言()B不仅是公众,不受保护或私有
(2)如果abstract_func()在一个声明为受保护的,那么abstract_func宣言()B可以是公共的或受保护的,但不能私有。
(3)如果abstract_func()在一个被声明为private,嘿嘿,它不能被定义为private!(致命错误:抽象函数::abstract_func()不能被声明为私有的)
两。接口
1。抽象类提供了具体的实施标准,而接口是一个纯粹的模板,接口只定义的功能和不包含的内容实现,接口与接口中声明的关键字。
2.interface完全是抽象的。它只能声明方法,只能声明公共方法,不能声明私有和受保护的方法。它不能定义方法体或声明实例变量。然而,接口可以声明常量变量。但是把常数变量接口违反其作为界面作用的目的,同时也混淆了接口和类的不同的价值观。如果你真的需要它,你可以把它放在相应的抽象类或类。
复制代码代码如下所示:
IA界面
{
const阿瓦尔= 3;
公共功能iafunc1();
公共功能iafunc2();
}
回声是:由;
三.实现接口的任何类都需要实现接口中定义的所有方法。
复制代码代码如下所示:
类E实现IA
{
公共功能iafunc1(){ echo在iafunc1 ;}
公共功能iafunc2(){ echo在iafunc2 ;}
}
否则,类必须声明为抽象的。
复制代码代码如下所示:
抽象类E实现了{ }
4。一个类可以声明实现一个接口使用implements关键字。这样做后,对接口的具体实施过程是作为一个抽象类,只包含一个抽象方法相同。一个类可以继承父类的同时实现多个接口。延伸条款应在实现clause.php只支持从父母继承,所以extends关键字只能跟着一类的名称。
复制代码代码如下所示:
接口IB
{
公共功能ibfunc1();
公共功能ibfunc2();
}
类D扩展了一个实现IA、IB
{
公共功能abstract_func1()
{
回声的abstract_func1班 / 的实施;
}
公共功能abstract_func2()
{
回声实施abstract_func2班 / ;
}
公共功能iafunc1(){ echo在iafunc1 ;}
公共功能iafunc2(){ echo在iafunc2 ;}
公共功能ibfunc1(){ echo在ibfunc1 ;}
公共功能ibfunc2(){ echo在ibfunc2 ;}
}
类d扩展b实现IA、IB
{
公共功能abstract_func1()
{
家长::abstract_func1();
回声重写abstract_func1班 / ;
}
公共功能abstract_func2()
{
回声实施abstract_func2班 / ;
}
公共功能iafunc1(){ echo在iafunc1 ;}
公共功能iafunc2(){ echo在iafunc2 ;}
公共功能ibfunc1(){ echo在ibfunc1 ;}
公共功能ibfunc2(){ echo在ibfunc2 ;}
}
5。接口不能实现另一个接口,但您可以继承多个接口。
复制代码代码如下所示:
接口ic扩展IA,IB }
F类实现ic
{
公共功能iafunc1(){ echo在iafunc1 ;}
公共功能iafunc2(){ echo在iafunc2 ;}
公共功能ibfunc1(){ echo在ibfunc1 ;}
公共功能ibfunc2(){ echo在ibfunc2 ;}
}
三、抽象类与接口的异同
1。同一点:
(1)两者都是抽象类,都不能实例化。
(2)接口实现类和抽象类的子类必须实现已声明的抽象方法。
2。不同点:
(1)接口需要实现,实现是使用的,抽象类需要继承和扩展。
(2)一个类可以实现多个接口,但是一个类只能继承一个抽象类。
(3)接口强调具体功能的实现,抽象类强调关系。
(4)虽然该接口的实现类和抽象类的子类必须实现相应的抽象方法的实现是不同的。每个接口中的方法是抽象方法,这是唯一的声明(声明,没有方法体),和实现类必须实现抽象类的子类可以。实施选择。这种选择具有两方面的含义:一)在抽象类中的所有方法都是抽象的,只有那些抽象的有一顶王冠是抽象的,和子类必须实现。那些没有抽象方法必须在抽象类中定义的方法;b)抽象类的子类继承它,非抽象方法可以直接继承,也可以被覆盖;可以选择实现的抽象方法,可以保留它的子类来实现,但是它也必须声明抽象类,它是一个抽象类,当然它不能被实例化。
(5)抽象类是接口与类之间的中介,抽象类在接口和类中起着重要作用,一方面抽象类是抽象的。它可以声明抽象方法来标准化子类必须实现的函数。另一方面,它还可以定义默认的方法体,直接使用或覆盖子类。此外,它还可以为继承使用的子类定义自己的实例变量。
(6)在接口的抽象方法不能被添加或添加到摘要关键词,隐隐的方法是抽象方法,以及最终的关键词不能添加防止抽象方法的继承,抽象类的抽象方法必须添加抽象声明在抽象方法抽象方法。
(7)在接口的抽象方法是公共的,只能是公共的,不可修改的私人保护剂。在抽象类中的抽象方法可以保护公众,修改,而不是私人的。
三.接口中的应用
(1)类和类需要协调通过特定的接口而不关心它是如何实现的。
(2)作为一个可以实现特定功能的符号,它也可以是任何接口方法的纯标识。
(3)您需要将一组类看作一个类,而调用方只通过接口连接到这一组类。
(4)需要执行一些具体的职能,这些职能之间可能没有联系。
4。抽象类的应用
总之,当您需要统一的接口,以及实例变量或默认方法时,您可以使用它:
(1)定义了一组接口,但是它们不想强制每个实现类实现所有接口。
(2)在某些情况下,只有纯接口不能满足类与类之间的协调,抽象的中介效应很好地满足这一点。
(3)一套协调的方法是标准化的。其中一些是通用的,独立于状态,可以不使用子类实现,而另一些则需要子类根据它们的具体状态实现特定的功能。