• 浅谈PHP面向对象编程(七、抽象类与接口)


    7.0 抽象类与接口


    当定义一个类时,常常需要定义一些方法来描述该类的行为特征、但有时这些方法的实现方式是无法确定的,此时就可以使用抽象类和接口。

    抽象类和接口用于提高程序的灵活性、抽象类是一种特殊的类,而接口又是一种待殊的抽象类。

    接下来本节将针对抽象类和接口进行详细讲解。

    7.1 抽象类


    当在定义一个类的 时候,其中所霜的某些方法暂时并不能完全定义出来,而是让其继承的类来实现,此时就可以用到抽象类。

    比如定又一个动物类,每种动物有一“叫” 的方法,面每种动物叫的方式不同,因此可以将动物类定义为一个抽象类。

    定义抽象类需要使用 abstract 关键字来修饰,语法格式具体如下:

    1 abstract class  类名{
    2       
    3    //类成员
    4   
    5 }

    由于每种动物叫的方式不同,所以需要将动物同的shut方法定义成抽象的, 即只有方法声明面设有方法体的方法,在子类继承时再来编写该方法的具体实规,这种特珠的方法称为抽象方法,其语法格式如下

    1 abstract function 方法名 ();

    为了更好的理解抽象类和抽象方法的使用,接下来t通过个案例来演示

    例7-19

     1 <?php
     2      //使用abstract关键字声明一个抽象类 
     3      abstract class Animal{    
     4         //在抽象类中声明抽象方法
     5         abstract public function shout(); 
     6      }
     7      //定义Dog类继承自Animal类
     8      class Dog extends Animal{
     9         //实现抽象方法shout()
    10          public function shout()
    11         {
    12              echo "汪汪......<br>";
    13          }
    14      }
    15     //定义Cat类继承自Animal类
    16     class Cat extends Animal{
    17          //实现抽象方法shout()
    18           public function shout()
    19          {
    20              echo "喵喵......<br>";
    21          }
    22      }
    23      $dog=new Dog();
    24      $dog->shout();
    25      $cat=new Cat();
    26     $cat->shout();
    27  ?>

    运行结果

    例7-19中,第3-6行代码定义了一个抽象类Animal. 然后使Dog类和Cat类继承Animal类并实现抽象方法shout(). 最后分别调用cat对象和dog对象的shout()方法,输出不同动物对应的叫声

    注意:

    (1)抽象类不能被实例化。

    (2)抽象类可以没有抽象方法,但有抽象方法的抽象关才有意义,一旦类包含了抽象方法,则这个类必须声明为abstract。

    (3)抽象关中可以有非抽象方法、成员属性和常量。

    (4)抽象方法不能有函数体,它只能存在于抽象类中。

    (5)如果一个类继承了某个抽象类,则它必须实现该抽象类的所有抽象方法、除非它自己也声明为抽象类。

    7.2 接口


    如果一个抽象类中的所有方法都是抽象的、则可以将这个类用另外一种方式来定义。即接口。在定义接口时,需要使用interface关键字,具体示例代码如下:

    1 interface Animal{
    2 
    3    public function run ();
    4 
    5    public function breathe();  
    6 
    7 }

    定义接口与定义一个标准的类类似,但其中定义的所有的方法都是空的。

    需要注意的是接口中的所有方法都是公有的,也不能使用 final关键字来修饰

    由于接口中定义的都是抽象方法,没有具体实现,需要通过类来实现接口。实现接口使用 implements 关键字。

    接下来通过一个案例来学习,如例7-20 所示

     1 <?php
     2      //定义Animal接口
     3      interface  Animal{
     4          public function run();
     5          public function shout();
     6      }
     7      //定义Dog类,实现了Animal接口
     8      class Dog implements Animal{
     9           public function run(){
    10               echo "狗在奔跑<br>";
    11          }
    12          public function shout(){
    13              echo "汪汪……<br>";
    14          }
    15      }
    16      //定义Cat类,实现了Animal接口
    17     class Cat implements Animal{
    18          public function run(){
    19              echo "猫在奔跑<br>";
    20         }
    21         public function shout(){
    22             echo "喵喵……<br>";
    23         }
    24      }
    25     $cat=new Cat();
    26     $cat->run();
    27     $cat->shout();
    28     $dog=new Dog();
    29     $dog->run();
    30     $dog->shout();
    31 ?>

     运行结果

    在例7-20中,首先定义了接口Animal,在接口Animal中声明了抽象方法run()和shout().
    然后分别通过Cat类和Dog类实现了Animal接口最后通过cat和dog对象调用run()和shout()方法。
    在PHP中类是单继承的,但一个类却可以实现多个接口,并且这些接口之间用逗号分展开,接下来通过一个具体的案例来学习,
    如例7-21所示。 

    例7-21

     1  <?php
     2      //定义Animal接口
     3      interface  Animal{
     4          public function run();
     5          public function shout();
     6      }
     7      //定义LandAnimal接口
     8      interface  LandAnimal{
     9          public function LiveOnLand();     
    10      }
    11     //定义Dog类,实现了Animal和LandAnimal接口
    12     class Dog implements Animal,LandAnimal{
    13          public function LiveOnLand(){
    14             echo"狗在陆地上生活<br>";
    15         }
    16          public function run(){
    17               echo "狗在奔跑<br>";
    18          }
    19          public function shout(){
    20             echo "汪汪……<br>";
    21         }
    22     }
    23     $dog=new  Dog();
    24     $dog->LiveOnLand();
    25     $dog->run();
    26     $dog->shout();
    27 ?>

    运行结果

    在例7-21中,动物类Dog同时实现了接口Animal和LandAnimal,

    通过dog对象调用了LandAnimal中的LiveOnLand()方法

    和Animal接口中的run()和shout()方法

    扩展-继承和接口的配合使用


    在使用implements关键宇实现接口的同 时,还可以使用extends 关键字继承一个类。

    即在继承一个类的同时实现接口,但一定要先使用extends继承一个类,再使用implements实现接口,

    具体示例如下所示:

    1 class 类名 extends 父类名 implements 接口1,接口2,....接口n{
    2 
    3      //实现所有接口中的抽象方法
    4 
    5 }

    PHP的单继承机制可保证类的纯洁性,比C++中的多继承机制简洁。

    但是不可否认,对子类功能的扩展有一定影响。

    所以我们认为实现接口可以看作是对继承的一种补充。

    实现接口可在不打破继承关系的前提下,对某个类功能扩展,非常灵活。

  • 相关阅读:
    3.默认参数的注意事项
    2.关键字global,nonlocal
    1.函数的结构,调用,传参,形参,实参,args,kwargs,名称空间,高阶函数
    19. 实现一个整数加法计算器(多个数相加):
    20.文件操作
    18.使用for循环计算+1-3+5-7+9-11+13...99的结果
    ubuntu docker更新镜像源
    虚拟环境的使用
    前端基础之HTML
    jQuery基本使用
  • 原文地址:https://www.cnblogs.com/lemon-Net-Skill/p/9811510.html
Copyright © 2020-2023  润新知