举例讲解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新建文件自动编号的思路与实现
Jun 27 PHP
php 文件上传实例代码
Apr 19 PHP
深入php数据采集的详解
Jun 02 PHP
下拉列表多级联动dropDownList示例代码
Jun 27 PHP
解析将多维数组转换为支持curl提交的一维数组格式
Jul 08 PHP
php查找任何页面上的所有链接的方法
Dec 03 PHP
WordPress中获取所使用的模板的页面ID的简单方法
Dec 31 PHP
PHP简单检测网址是否能够正常打开的方法
Sep 04 PHP
php fread读取文件注意事项
Sep 24 PHP
Yii2框架可逆加密简单实现方法
Aug 25 PHP
PHP依赖注入原理与用法分析
Aug 21 PHP
php实现数字补零的方法总结
Sep 12 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企业级应用之常见缓存技术篇
2011/01/27 PHP
深入PHP数据加密详解
2013/06/18 PHP
php获取本周开始日期和结束日期的方法
2015/03/09 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
2015/07/06 PHP
反射调用private方法实践(php、java)
2015/12/21 PHP
php实现跨域提交form表单的方法【2种方法】
2016/10/17 PHP
asp.net网站开发中用jquery实现滚动浏览器滚动条加载数据(类似于腾讯微博)
2012/03/14 Javascript
jQuery的animate函数学习记录
2014/08/08 Javascript
js由下向上不断上升冒气泡效果实例
2015/05/07 Javascript
理解Javascript的call、apply
2015/12/16 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
jQuery实现按比例缩放图片的方法
2017/04/29 jQuery
jQuery查找和过滤_动力节点节点Java学院整理
2017/07/04 jQuery
JQuery EasyUI的一些常用组件
2017/07/12 jQuery
微信小程序如何获取用户信息
2018/01/26 Javascript
vue计算属性及使用详解
2018/04/02 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
浅谈Vue为什么不能检测数组变动
2019/10/14 Javascript
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
python基础教程之popen函数操作其它程序的输入和输出示例
2014/02/10 Python
Python魔术方法详解
2015/02/14 Python
python装饰器与递归算法详解
2016/02/18 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
2018/06/06 Python
详解Python中的分组函数groupby和itertools)
2018/07/11 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
Django中使用Whoosh进行全文检索的方法
2019/03/31 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
2019/07/04 Python
python实现最小二乘法线性拟合
2019/07/19 Python
自定义django admin model表单提交的例子
2019/08/23 Python
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
初三政治教学反思
2014/01/30 职场文书
2014年林业工作总结
2014/12/05 职场文书
幼儿园国培研修日志
2015/11/13 职场文书
教师反邪教心得体会
2016/01/15 职场文书
Django migrate报错的解决方案
2021/05/20 Python
宝塔更新Python及Flask项目的部署
2022/04/11 Python