• PHP中抽象类abstract和接口interface的区别


    PHP中抽象类abstract和接口interface的区别

    abstract类

    1、关于抽象类

    1) 抽象类必须有关键字abstract来修饰,抽象类中可以不含有抽象方法,如果一个类包含抽象方法,则该类必须是抽象类。

    2) 抽象类不能被直接实例化,它的意义在于被扩展(extends)

    2、关于抽象类中的方法

    1) 抽象方法中没有大括号。

    2) 只要方法没有用abstract声明,在其子类中就不用实现。而且在子类中该方法为公共方法。子类中可以重载这些方法。

    3) 抽象类中的方法可以有参数,也可以为空。如果抽象方法有参数,那么子类的实现也必须有相同的参数个数。

    4) 只要方法没有用abstract声明,在其子类中就不用实现。而且在子类中该方法为公共方法。

    5) 如果子类需要实例化,前提是它继承(extends)了该抽象类。实现了抽象类中的所有抽象方法,否则,子类也要用abstract标识为抽象类。

    6)抽象方法是必须可以被子类继承实现的,所以不可以用private修饰符去限定abstract抽象方法,可以用public和protected去修饰。

    作用:

    1)当我们发现我们写的很多类里面用很多方法都是不断在重复写,那我们就可以考虑使用抽象类了。比起去重写一个公共类,每次调用相应方法之前必须得实例化这个类。使用抽象类省去了实例化的这个步骤,让我们就像直接调用本类方法一样方便,而且还可以重载这个方法。

    2)跟继承普通类的区别,抽象类可以把类像的部分抽出来,只需要声明抽象方法,不会具体实现。待子类继承后根据具体业务自行去实现。

    参考代码:

     1 <?php
     2 
     3 
     4 abstract class User
     5 {
     6     abstract public function findIdentity($id);
     7 
     8     abstract protected function getAuthKey();
     9 
    10     public function getName($name)
    11     {
    12         echo $name;
    13     }
    14 
    15     public function getId()
    16     {
    17         echo 123;
    18     }
    19 }
    20 
    21 abstract class User1 extends User
    22 {
    23     public function findIdentity($id)
    24     {
    25         echo $id;
    26     }
    27 }
    28 
    29 class User2 extends User
    30 {
    31     public function findIdentity($id)
    32     {
    33         echo $id;
    34     }
    35 
    36     public function getAuthKey()
    37     {
    38         echo 'test';
    39     }
    40 
    41 }
    42 
    43 $user2 = new User2();
    44 $user2->getId();
    45 //结果输出: 123

    interface类

    1)接口类就是一个类的领导者,指明方向,子类必须完成它指定方法。

    2)定义了一个接口类,它里面的所有方法其子类必须实现。接口是类的一个模板,不能被直接实例化。其子类必须实现(implements)接口中定义的所有方法。

    作用:当有很多人一起开发一个项目时,可能都会去调用别人写的一些类。如何知道别人是如何给相应功能的实现方法命名?这个时候接口类就发挥作用啦~

    参考代码:

     1 <?php
     2 
     3 interface User
     4 {
     5 
     6     public function getName($name);
     7 
     8     public function getAge($age);
     9 
    10 }
    11 
    12 class MyUser implements User
    13 {
    14 
    15     public function getName($name)
    16     {
    17         echo $name;
    18     }
    19 
    20     function getAge($age)
    21     {
    22         echo $age;
    23     }
    24 
    25 }

    abstract与interface的区别

    1、抽象类需要继承,用extends,而接口需要实现,用implements

    2、一个类可以实现多个接口,但只能继承一个抽象类(PHP只支持单继承)

    3、接口中每个方法都只有声明而没有实现,其中每个接口的子类都必须要实现接口中的所有方法。而抽象类中, 只要方法没有用abstract声明,在其子类中就不用实现。另外,如果子类不需要实例化,也可以不用全部实现抽象类中的抽象方法。

    4、接口中只能声明public的方法不能声明private和protected的方法,不能对方法进行具体实现,也不能声明实例变量。抽象类也不能用private,但是可以用protected或者public来声明方法。

  • 相关阅读:
    linux进程管理
    使用PL/SQL Developer 学习pl/sql
    Linux入门到放弃之一《在VMware虚拟机中安装Linux系统(RedHat)》
    解决Java连接Oracle 12c存在的问题
    Linux安装64位Mysql5.7.22
    在centos下启动nginx出现Failed to start nginx.service:unit not found
    windows10下IntelliJ IDEA使用logback设置日志输出目录
    Windows下mysql5.6升级到5.7的方法
    Spring+Hibernate+Struts2整合之实现登录功能
    Hibernate关系映射之many-to-many(多对多)
  • 原文地址:https://www.cnblogs.com/hld123/p/14245189.html
Copyright © 2020-2023  润新知