18:PHP抽象类

抽象类

PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

 

继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。 这也适用于 PHP 5.4 起的构造函数。在 PHP 5.4 之前的构造函数声明可以不一样的。

  1.  <?php
  2. abstract class  AbstractClass
  3.  {
  4.      // 强制要求子类定义这些方法
  5.      abstract protected function  getValue ();
  6.      abstract protected function  prefixValue ( $prefix );
  7.      // 普通方法(非抽象方法)
  8.      public function  printOut () {
  9.          print  $this -> getValue ();
  10.      }
  11.  }
  12. class  ConcreteClass1  extends  AbstractClass
  13. {
  14.     protected function  getValue () {
  15.         return  "ConcreteClass1" ;
  16.     }
  17.     public function  prefixValue ( $prefix ) {
  18.         return  " { $prefix } ConcreteClass1" ;
  19.     }
  20. }
  21. class  ConcreteClass2  extends  AbstractClass
  22. {
  23.     public function  getValue () {
  24.         return  "ConcreteClass2" ;
  25.     }
  26.     public function  prefixValue ( $prefix ) {
  27.         return  " { $prefix } ConcreteClass2" ;
  28.     }
  29. }
  30. $class1  = new  ConcreteClass1 ;
  31.  $class1 -> printOut ();
  32. echo  $class1 -> prefixValue ( 'FOO_' ) ;//ConcreteClass1 { FOO_ } ConcreteClass1
  33. $class2  = new  ConcreteClass2 ;
  34.  $class2 -> printOut ();
  35. echo  $class2 -> prefixValue ( 'FOO_' ) ;//ConcreteClass2 { FOO_ } ConcreteClass2

 

提示:

老代码中如果没有自定义类或函数被命名为“abstract”,则应该能不加修改地正常运行。

  1. <?php
  2.  abstract class  AbstractClass
  3.  {
  4.      // 我们的抽象方法仅需要定义需要的参数
  5.      abstract protected function  prefixName ( $name );
  6.  }
  7. class  ConcreteClass  extends  AbstractClass
  8. {
  9.     // 我们的子类可以定义父类签名中不存在的可选参数
  10.     public function  prefixName ( $name ,  $separator  =  "." ) {
  11.         if ( $name  ==  "Pacman" ) {
  12.             $prefix  =  "Mr" ;
  13.         } elseif ( $name  ==  "Pacwoman" ) {
  14.             $prefix  =  "Mrs" ;
  15.         } else {
  16.             $prefix  =  "" ;
  17.         }
  18.         return  " { $prefix }{ $separator }   { $name } " ;
  19.     }
  20. }
  21. $class  = new  ConcreteClass ;
  22. echo  $class -> prefixName ( "Pacman" );//{ Mr }{ . } { Pacman }
  23. echo  $class -> prefixName ( "Pacwoman" );//{ Mrs }{ . } { Pacwoman } 

 

php抽象类

PHP抽象类应用要点:

1.定义一些方法,子类必须完全实现这个抽象中所有的方法

2.不能从抽象类创建对象,它的意义在于被扩展

3.抽象类通常具有抽象方法,方法中没有大括号

 

PHP抽象类应用重点:

1.抽象方法不必实现具体的功能,由子类来完成

2.在子类实现抽象类的方法时,其子类的可见性必须大于或等于抽象方法的定义

3.抽象类的方法可以有参数,也可以为空

4.如果抽象方法有参数,那么子类的实现也必须有相同的参数个数

 

PHP抽象类规则:

某个类只要至少含有一个抽象方法,就必须声明为抽象类

抽象方法,不能够含有函数体

继承抽象类的子类,实现抽象方法的,必须跟该抽象方法具有相同或者更低的访问级别

继承抽象类的子类,如果不实现所有抽象方法,那么该子类也为抽象类

 

抽象类就把类像的部分抽出来,这句看上去很搞笑,其实它说出了抽象类的真理,抽象类的作用是,当你发现你的很多类里面用很多方法你不断的在重复写,那你就可以考虑使用抽象类了,你可能会说“我不是可以重写一个类每个公共类我个实例化一个这个公共类,调用相同的方法就可以了”,这里是可以,实际上抽象类做的工作也就是这个,不过他省去了你实例化的这个步骤,让你就像直接调用本类方法一样方便,而且你还可以重载这个方法。

 

小调查:

你在实际项目开发中,你用过了抽象类吗?请在评论中告诉大家!

    A+
发布日期:2017年01月01日 22:27:13  所属分类:PHP教程
最后更新时间:2017-01-01 22:38:14
付杰
  • ¥ 298.0元
  • 市场价:398.0元
  • ¥ 388.0元
  • 市场价:388.0元
  • ¥ 159.0元
  • 市场价:599.0元
  • ¥ 1.0元
  • 市场价:9.9元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: