举例讲解PHP面对对象编程的多态


Posted in PHP onAugust 12, 2015

什么是多态?
多态性,其来自于dictionary.com的定义是"以不同形式,阶段或者类型出现在独立的组织中或者同种组织中,而不存在根本区别。"由该定义,我们可以认为,多态性是一种通过多种状态或阶段来描述相同对象的编程方式。其实,它的真正意义在于:实际开发中,我们只需要关注一个接口或基类的编程,而不必担心一个对象所属于的具体类(class)。
如果你熟悉设计模式,即使只是有个初步了解,那么你也会了解这个概念。事实上,PHP5多态性可能是基于模式设计编程中的最伟大的工具。它允许我们以一种逻辑的方式来组织相类似的对象从而实现在具体编码时不必担心对象的具体类型;而且,我们只需要对一个所期望的接口或基类编程即可。一个应用程序越抽象,则它就显得越灵活--而多态性是对行为加以抽象的最好的方式之一。
例如,让我们考虑一个叫Person的类。我们可以用称为David,Charles和Alejandro的类来子类化Person。Person有一个抽象方法AcceptFeedback(),所有的子类都要实现这个方法。这意味着,任何使用基类Person的子类的代码都能调用方法AcceptFeedback()。你不必检查该对象是一个David还是一个Alejandro,仅知道它是一个Person就够了。结果是,你的代码只需关注"最小公分母"-Person类即可。
在这个示例中的Person类也可以被创建为一个接口。当然,与上面相比存在一些区别,主要在于:一个接口并没有给出任何行为,而仅确定了一组规则。一个Person接口要求的是"你必须支持AddFeedback()方法",而一个Person类可以提供一些AddFeedback()方法的缺省代码-你对之的理解可以是"如果你不选择支持AddFeedback(),那么你应该提供一种缺省实现。"至于如何选择接口或基类则并非本文的主题;但是,一般说来,你需要通过基类来实现一个缺省的方法。如果你能够简单地勾勒出你的类所要实现的一组期望的功能,那么你也可以使用一个接口。

通俗理解
多态最直接的定义就是让具有继承关系的不同类对象,可以对相同名称的成员函数调用,产生不同的反应结果

多态的代码

   

<?php 
   
  /** 
   * 声明接口Demo 
   * @author wzy 
   * 
   */ 
  interface Demo 
  { 
   
    const NAME = "wangzhengyi"; 
   
    const AGE = 25; 
   
    function fun1 (); // 声明方法默认是public abstract 
    function fun2 (); 
  } 
   
  class One implements Demo 
  { 
   
    public function fun1 () 
    { 
      echo Demo::NAME . "就读于中国传媒大学"; 
    } 
   
    public function fun2 () 
    { 
      echo Demo::NAME . "的年龄是" . Demo::AGE; 
    } 
  } 
   
  class Two implements Demo 
  { 
   
    public function fun1 () 
    { 
      echo Demo::NAME . "在北京灵创众和科技有限公司实习中"; 
    } 
   
    public function fun2 () 
    { 
      echo Demo::NAME . "去年的年龄是24"; 
    } 
  } 
   
  // 同一个接口,实现同一个方法,不同的对象,反应结果不同。这就是多态的表现和应用 
   
  $one = new One(); 
  $one->fun1(); // wangzhengyi就读于中国传媒大学 
  $one->fun2(); // wangzhengyi的年龄是25 
   
  echo "<br>"; 
   
  $two = new Two(); 
  $two->fun1(); // wangzhengyi在北京灵创众和科技有限公司实习中 
  $two->fun2(); // wangzhengyi去年的年龄是24
PHP 相关文章推荐
PHP+MYSQL开发工具及资源收藏
Jan 02 PHP
隐性调用php程序的方法
Mar 09 PHP
php 自写函数代码 获取关键字 去超链接
Feb 08 PHP
php中使用addslashes函数报错问题的解决方法
Feb 06 PHP
php中getservbyport与getservbyname函数用法实例
Nov 18 PHP
自己写的php curl库实现整站克隆功能
Feb 12 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
Jul 06 PHP
PHP错误和异常处理功能模块示例
Nov 12 PHP
使用 laravel sms 构建短信验证码发送校验功能
Nov 06 PHP
php使用pecl方式安装扩展操作示例
Aug 12 PHP
PHP单元测试配置与使用方法详解
Dec 27 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 27 PHP
详解PHP中的状态模式编程
Aug 11 #PHP
简单介绍PHP的责任链编程模式
Aug 11 #PHP
PHP会话处理的10个函数
Aug 11 #PHP
PHP的Socket网络编程入门指引
Aug 11 #PHP
php实现的农历算法实例
Aug 11 #PHP
PHP发送短信代码分享
Aug 11 #PHP
php实现可逆加密的方法
Aug 11 #PHP
You might like
PHP下MAIL的另一解决方案
2006/10/09 PHP
php缩小png图片不损失透明色的解决方法
2013/12/25 PHP
在WordPress中实现发送http请求的相关函数解析
2015/12/29 PHP
laravel5实现微信第三方登录功能
2018/12/06 PHP
PHP实现的多进程控制demo示例
2019/07/22 PHP
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
javascript实现日期按月份加减
2015/05/15 Javascript
详解JavaScript数组的操作大全
2015/10/19 Javascript
探索angularjs+requirejs全面实现按需加载的套路
2016/02/26 Javascript
javascript之IE版本检测超简单方法
2016/08/20 Javascript
微信小程序入门教程
2016/11/18 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
2016/12/02 Javascript
解决webpack打包速度慢的解决办法汇总
2017/07/06 Javascript
[00:11]战神迅矛
2019/03/06 DOTA
linux系统使用python监测系统负载脚本分享
2014/01/15 Python
手动实现把python项目发布为exe可执行程序过程分享
2014/10/23 Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
Django发送html邮件的方法
2015/05/26 Python
python提取字典key列表的方法
2015/07/11 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
2017/12/14 Python
Python3多线程操作简单示例
2018/05/22 Python
flask框架实现连接sqlite3数据库的方法分析
2018/07/16 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
2018/10/15 Python
python时间与Unix时间戳相互转换方法详解
2020/02/13 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
2020/06/22 Python
Python爬虫之Selenium设置元素等待的方法
2020/12/04 Python
德国百年厨具品牌WMF美国站:WMF美国
2016/09/12 全球购物
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
四风问题查摆剖析材料
2014/10/11 职场文书
2015年度房地产工作总结
2015/04/09 职场文书
2015年科学教研组工作总结
2015/07/22 职场文书
2015质检员个人年终工作总结
2015/10/23 职场文书
《牧场之国》教学反思
2016/02/22 职场文书
Html5通过数据流方式播放视频的实现
2021/04/27 HTML / CSS