举例讲解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 相关文章推荐
mysql 字段类型说明
Apr 27 PHP
php Undefined index和Undefined variable的解决方法
Mar 27 PHP
php数组函数序列之in_array() - 查找数组中是否存在指定值
Nov 07 PHP
PHP数组循环操作详细介绍 附实例代码
Feb 03 PHP
深入解读php中关于抽象(abstract)类和抽象方法的问题分析
Jan 03 PHP
php遍历目录输出目录及其下的所有文件示例
Jan 27 PHP
php获取mysql字段名称和其它信息的例子
Apr 14 PHP
PHP导出Excel实例讲解
Jan 24 PHP
Joomla调用系统自带编辑器的实现方法
May 05 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
Jul 18 PHP
遍历echsop的region表形成缓存的程序实例代码
Nov 01 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
Mar 28 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
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
2012/06/27 PHP
php中curl使用指南
2015/02/05 PHP
php实现单笔转账到支付宝功能
2018/10/09 PHP
javascript打开新窗口同时关闭旧窗口
2009/01/16 Javascript
js数据验证集合、js email验证、js url验证、js长度验证、js数字验证等简单封装
2010/05/15 Javascript
js中将URL中的参数提取出来作为对象的实现代码
2011/08/16 Javascript
JavaScript高级程序设计 错误处理与调试学习笔记
2011/09/10 Javascript
js几秒以后倒计时跳转示例
2013/12/26 Javascript
js字符串操作方法实例分析
2015/05/06 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
理解Javascript的call、apply
2015/12/16 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
2017/04/28 jQuery
vue better scroll 无法滚动的解决方法
2018/06/07 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
2020/05/18 Javascript
Python深入学习之对象的属性
2014/08/31 Python
机器学习经典算法-logistic回归代码详解
2017/12/22 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
2019/01/17 Python
浅析Python __name__ 是什么
2020/07/07 Python
Python3.9.1中使用match方法详解
2021/02/08 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
深入浅析css3 中display box使用方法
2015/11/25 HTML / CSS
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
教育孩子心得体会
2014/01/01 职场文书
尽职尽责村干部自我鉴定
2014/01/23 职场文书
护士自我评价
2014/02/01 职场文书
高中军训感言500字
2014/02/24 职场文书
关于读书的活动方案
2014/08/14 职场文书
2015年幼儿园安全工作总结
2015/05/12 职场文书
2016三八妇女节校园广播稿
2015/12/17 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
用Python写一个简易版弹球游戏
2021/04/13 Python
如何用Navicat操作MySQL
2021/05/12 MySQL
上帝为你开了一扇窗之Tkinter常用函数详解
2021/06/02 Python
Python+Matplotlib+LaTeX玩转数学公式
2022/02/24 Python