开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第二阶段:多态】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/712/detail/12689
多态
主要内容:
一、目标
二、概念
三、步骤
四、小结
学习面向对象的三大特性之多态,此概念相对较麻烦,需要仔细了解。
一、目标
了解多态的概念,理解多态的作用
二、概念
多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果
指可以调用多个同名函数,由于数据不同,可能出现不同效果,一个名字可能有多种状态,可以换不同方式触发不同的状态和效果,此为多态,以下为多态的条件:
1.需要发生类的继承,同时出现方法的重写(override),即子类拥有与父类同名的方法
2.在实例化对象的时候让父类对象指向子类对象(强制类型,PHP 不支持)
PHP 的优势为弱势类型,故操作数据十分灵活。
3.结果:父类对象表现的子类对象的特点
三、步骤
1、明确继承关系:子类继承父类
2、子类重写父类方法
3、实例化子类,但是存储子类对象的数据类型为父类对象
4、实现:父类对象表现出子类对象的形态
父类的对象,调用子类的方法,此表现为多态。
四、示例
1、多态需要强类型语言,以 Java 为例
观察可得,Animal 为一个动物类,方法为 show ,system.out.orint1n(“Animal”); 意思为输出,Dog extends Animal 为子类,show 方法重写,然后实例化子类,指向的变量类型为Animal 类型,父类的类型及名义,但保存为子类的对象,当父类的对象调用show 方法时,打印为dog ,父类的形态表现为子类最终的形态,此为多态。
2、PHP 是弱类型语言,所以不存在变量的强制类型,因此PHP不支持多态。但是PHP可以模拟多态
函数里的强制类型,强制数据的传入类型,是对数据进行限定,并没有限定变量。而强类型,为限制变量本身,变量只能存储某些数据类型,其他任何数据类型都不可以。PHP 不支持多态,但是可以模拟多态。
(1)多种子类继承父类
(2)子类重写父类方法
(3)父类定义方法实现统一重写方法调用
父类里定义方法,专门调用子类重写的父类方法,但并不是当前的方法。
观察可得,父类里面的 show 方法为强制类型,要求对象必须为 Animal ,display 为对象调用自己的方法,父类也有此方法,输出的为类名 Animal ,父类的两个方法都可以进行调用,此时有名为 cat 的一个子类,因为同名,故重写父类的方法,dog 也进行重写,此时调用Animal 的静态方法,将 new cat 对象传入,此时输出 cat,cat 调用自己的display 方法,同理,dog 输出 dog ,对象不同导致输出的结果不同,此表现为多态的模拟。因为存在继承,彼此之间是相通的,故 cat 对象可以为 Animal 对象,此为多态的概念。若想深入了解,建议大家多了解强类型语言的多态。
五、小结
1、多态的发生必须是有继承关系,并且子类要重写父类方法
2、多态是指父类对象拥有子类形态,并且可以表现出子类的特性(调用子类方法)
3、PHP 是弱类型语言,不支持多态
PHP 可以进行模拟,建立在继承、重写、多态本身的特性了解的基础上去理解多态。