PHP类的多态与封装

多态性(Polymorphism),简单的说就是同一操作作用于不同的类的实例上时,会产生不同的执行结果。

在软件设计中,多态使得应用程序更加模块化和可扩展。

多态性分两种:

  • 静态多态性:指一个同名函数或者一个类中的同名方法,根据参数列表(类型及个数)的不同来区别语义,即所谓的函数重载。但PHP不支持函数重载。

  • 动态多态性:指类的成员方法,能根据调用它的对象类型的不同,自动做出适应性调整,而且调整时发生在程序运行时。(PHP通过抽象类和接口技术来实现动态多态性)

子类覆盖父类

子类对继承自父类的方法进行“重写”,就是子类中定义一个同名的父类方法。
覆盖后若要使用父类原来的方法,需要使用关键字parent 和 域操作符::

parent::父类同名方法;

如果父类“很强势”,不想自己的方法别子类覆盖重写,可以使用final关键字来修饰该方法。

抽象类和抽象方法

抽象类是一种不能被实例化的类,只能作为父类被其他类继承。

与其他类一样抽象类也可以有属性和方法,但不同点在于,抽象类必须至少包含一个抽象方法。

所谓抽象方法,就是没有具体实现的方法,其对应的函数体为空。

抽象方法的细节只能在子类中实现,而且子类必须实现所继承的抽象类中的所有的抽象方法。

抽象类和抽象方法都用关键字abstract来定义,格式如下:

abstract class 抽象类名{
    //...
    abstract [public | protected] function 抽象方法名 ([方法参数]);
    //定义抽象方法
}

其中,抽象方法的访问控制修饰符只能是 public 或 protected 。

如果抽象方法声明为 public ,则子类中实现的方法也应声明为 public ;

如果抽象方法声明为 protected ,则子类中实现的方法既可以声明为 protected,也可以声明为 public。

抽象方法和抽象类的作用:
抽象方法和抽象类主要用于设计复杂的层次关系,这种层次关系要求子类都包含并重写某个特定的方法。

例如,人按社会分工可以分为学生、工人、商人等,每个人都要工作,只是岗位不同,学生要在学校听课,工人要在工地干活,商人要在店铺卖东西等。

如果把人作为一个抽象类,工作作为抽象方法,把学生、工人、商人作为继承该类的子类,那么工作这个方法在子类中的实现细节是不同的。

abstract class 人类{  //抽象类,不能被实例化,只能作为父类被其他类继承
    //...
    abstract function 工作();  //抽象方法,只定义没有具体内容
}

class 学生 extends 人类{
    //继承了人类这个抽象类,就必须实现人类中所有的抽象方法
    function 工作(){
        写作业
    }
}

class 工人 extends 人类{
    //继承了人类这个抽象类,就必须实现人类中所有的抽象方法
    function 工作(){
        干活
    }
}

接口

接口是一种多态技术。无论是普通类还是抽象类,都只能实现单继承,即一个子类只能继承一个父类。而要继承多个类就要通过接口(interface)来实现。

接口也可以看着是一种类,
只是这种类中可以定义常量,当不能定义属性变量;
可以定义方法,但方法必须为空,且方法必须为 public (可以省略,因为类的方法默认就是 public)

接口通过关键字 interface 来定义,格式如下:

interface 接口名{
    const 常量名 = 值;//只能定义常量,不能定义变量
    ...
    function 方法名([参数]); //只定义,没有具体内容
}

子类通过 implements 关键字来实现接口,格式如下:

class 子类名 implements 接口名{
    //子类实现细节
}

子类可以实现多个接口,接口名之间用逗号“,”连接。格式如下:

class 子类名 implements 接口名1, 接口名2, 接口名3{
    //子类实现细节
}

子类在实现接口时,必须实现接口中所有的方法。

思考:接口和抽象类抽象方法有什么异同点?
答:
相同点:
接口和抽象类中的方法都是定义而没有具体内容。
均只能作为父类被其他类继承。
子类均要实现抽象方法或接口中的所有方法。
接口 interface --- 子类 implements
抽象类 abstract --- 子类 ententds
不同点:
子类只能继承一个抽象类(子类只能单继承),子类可以有多个接口(可以看成多个父类)。
接口中只能定义常量而不能定义变量,而抽象类可以。

(0)

相关推荐

  • 玩转PHP中的抽象类与接口

    玩转PHP中的抽象类与接口 在面向对象开发中,特别是使用现代化框架的过程中,我们经常会和接口.抽象类打交道.特别是我们自己尝试去封装一些功能时,接口和抽象类往往会是我们开始的第一步,但你真的了解它们吗 ...

  • Java错题整理

    Java错题整理

  • 类的多态(三)

    子类即是父类对象,这一点还需要再强调一下,尤其是在作为方法的参数时,特别好用,可以经常用. 以形状为例. 1.形状shape是一个接口,里面只有一个计算面积的抽象方法. 2.圆Circle是一个类,实 ...

  • Java学习——37、类的多态(二)

    类型的多态主要体现在:子类是一种父类类型. 子类通过继承扩充和发展了它的父类,子类是父类的一种特殊类型. 1.子类对象即是父类对象 子类对象包含了父类的所有成员,包括成员变量和成员方法,所以子类对象也 ...

  • Java学习——36、类的多态(一)

    多态性是指"一种定义,多种实现".例如,画画.同是画画,但每一个人,会画出来不同的画,这就是多态. 多态主要有方法的多态和类型的多态. 今天介绍方法的多态. 方法的多态包括方法的重 ...

  • 不要再封装各种Util工具类了,这个神级框架值得拥有!

    重磅干货,第一时间送达 来自:方志朋 大家好,我是你们帅气的熊猫哥! Hutool 谐音 "糊涂",寓意追求 "万事都作糊涂观,无所谓失,无所谓得" 的境界. ...

  • 类与结构体性能对比测试——以封装网络心跳包为例

    类与结构体性能对比测试——以封装网络心跳包为例

  • 面向对象的核心特征之:封装、继承、多态

    面向对象的核心特征之:封装、继承、多态

  • 封装+继承+多态

    面向对象三大特性 封装: Encapsulation是指一种将抽象性函式接口的实现细节部份包装.隐藏起来的方法.封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随意访问.要访问该类 ...

  • 不要再自己封装各种Util工具类了,这款神仙级框架你值得拥有!

    来源:ryanc.cc/archives/hutool-java-tools-lib 作者:Ryan Wang 简介 Hutool 谐音 "糊涂",寓意追求 "万事都作糊 ...

  • 基础知识--封装、继承、多态、抽象

    一.封装 封装:是面向对象方法的重要原则,就是把对象的属性和行为(数据)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,就是把不想告诉或者不该告诉别人的东西隐藏起来,把可以告诉别人的公开,别人只 ...