多态是面向对三个重要特性之一,但是有时跟一些php开发的朋友聊天,发现很多php程序员对多态都存在误解,有不少人以为多态就是根据传入参数的类型和个数不同,执行不同的函数,而其实,这个观点是错误的。
那么我们先引用百度百科对多态的描述吧。在面向对象语言中,接口的多种不同的实现方式即为多态。多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
从这个定义中,我们可以理解,多态其实引入的是整个类,如果用工厂来比喻,多态引入的是整条生产线,实现的是工厂模式的工作模式。而根据传入参数的类型和个数不同,执行不同的函数,这种工作模式其实可以说是映射,而不是多态,它实现的是根据传入的参数类型和个数不同,映射到对应的不同函数中执行不同的代码,这也不是工厂模式。
好吧,说了这么多理论,给一个案例给大家,一下子就知道什么是多态了。
- <?php
- /**
- * 数据库基类
- */
- interface SqlDri {
- public function connect();
- }
- /**
- * mysql子类
- */
- class MysqlObj implements SqlDri {
- public function connect() {
- print "mysql connect success!";
- }
- }
- /**
- * mssql子类
- */
- class MssqlObj implements SqlDri {
- public function connect() {
- print "mssql connect success!";
- }
- }
- /**
- * 多态入口
- */
- class SqlEnt {
- public function connect(SqlDri $SqlDri) {
- $SqlDri->connect();
- }
- }
- $SqlEnt = new SqlEnt();
- $SqlEnt->connect(new MysqlObj());
- //$SqlEnt->connect(new MssqlObj());
- ?>
1.什么是多态
多态(Polymorphism)按字面上意思理解就是“多种形状”。可以理解为多种表现形式,也即“一个对外接口,多个内部实现方法”。在面向对象的理论中,多态性的一般定义为:同一个操作作用于不同的类的实例,将产生不同的执行结果。也即不同类的对象收到相同的消息时,将得到不同的结果。
在实际的应用开发中,采用面向对象中的多态主要在于可以将不同的子类对象都当作一个父类来处理,并且可以屏蔽不同子类对象之间所存在的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
2. 多态的应用设计
在实际的应用开发中,通常为了使项目能够在以后的时间里的轻松实现扩展与升级,需要通过继承实现可复用模块进行轻松升级。在进行可复用模块设计时,就需要尽可能的减少使用流程控制语句。此时就可以采用多态实现该类设计。