抽象类
PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。 这也适用于 PHP 5.4 起的构造函数。在 PHP 5.4 之前的构造函数声明可以不一样的。
- <?php
- abstract class AbstractClass
- {
- // 强制要求子类定义这些方法
- abstract protected function getValue ();
- abstract protected function prefixValue ( $prefix );
- // 普通方法(非抽象方法)
- public function printOut () {
- print $this -> getValue ();
- }
- }
- class ConcreteClass1 extends AbstractClass
- {
- protected function getValue () {
- return "ConcreteClass1" ;
- }
- public function prefixValue ( $prefix ) {
- return " { $prefix } ConcreteClass1" ;
- }
- }
- class ConcreteClass2 extends AbstractClass
- {
- public function getValue () {
- return "ConcreteClass2" ;
- }
- public function prefixValue ( $prefix ) {
- return " { $prefix } ConcreteClass2" ;
- }
- }
- $class1 = new ConcreteClass1 ;
- $class1 -> printOut ();
- echo $class1 -> prefixValue ( 'FOO_' ) ;//ConcreteClass1 { FOO_ } ConcreteClass1
- $class2 = new ConcreteClass2 ;
- $class2 -> printOut ();
- echo $class2 -> prefixValue ( 'FOO_' ) ;//ConcreteClass2 { FOO_ } ConcreteClass2
提示:
老代码中如果没有自定义类或函数被命名为“abstract”,则应该能不加修改地正常运行。
- <?php
- abstract class AbstractClass
- {
- // 我们的抽象方法仅需要定义需要的参数
- abstract protected function prefixName ( $name );
- }
- class ConcreteClass extends AbstractClass
- {
- // 我们的子类可以定义父类签名中不存在的可选参数
- public function prefixName ( $name , $separator = "." ) {
- if ( $name == "Pacman" ) {
- $prefix = "Mr" ;
- } elseif ( $name == "Pacwoman" ) {
- $prefix = "Mrs" ;
- } else {
- $prefix = "" ;
- }
- return " { $prefix }{ $separator } { $name } " ;
- }
- }
- $class = new ConcreteClass ;
- echo $class -> prefixName ( "Pacman" );//{ Mr }{ . } { Pacman }
- echo $class -> prefixName ( "Pacwoman" );//{ Mrs }{ . } { Pacwoman }
PHP抽象类应用要点:
1.定义一些方法,子类必须完全实现这个抽象中所有的方法
2.不能从抽象类创建对象,它的意义在于被扩展
3.抽象类通常具有抽象方法,方法中没有大括号
PHP抽象类应用重点:
1.抽象方法不必实现具体的功能,由子类来完成
2.在子类实现抽象类的方法时,其子类的可见性必须大于或等于抽象方法的定义
3.抽象类的方法可以有参数,也可以为空
4.如果抽象方法有参数,那么子类的实现也必须有相同的参数个数
PHP抽象类规则:
某个类只要至少含有一个抽象方法,就必须声明为抽象类
抽象方法,不能够含有函数体
继承抽象类的子类,实现抽象方法的,必须跟该抽象方法具有相同或者更低的访问级别
继承抽象类的子类,如果不实现所有抽象方法,那么该子类也为抽象类
抽象类就把类像的部分抽出来,这句看上去很搞笑,其实它说出了抽象类的真理,抽象类的作用是,当你发现你的很多类里面用很多方法你不断的在重复写,那你就可以考虑使用抽象类了,你可能会说“我不是可以重写一个类每个公共类我个实例化一个这个公共类,调用相同的方法就可以了”,这里是可以,实际上抽象类做的工作也就是这个,不过他省去了你实例化的这个步骤,让你就像直接调用本类方法一样方便,而且你还可以重载这个方法。
小调查:
你在实际项目开发中,你用过了抽象类吗?请在评论中告诉大家!