举例讲解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 相关文章推荐
多文件上载系统完整版
Oct 09 PHP
php empty函数判断mysql表单是否为空
Apr 12 PHP
PHP 创建标签云函数代码
May 26 PHP
php文章内容分页并生成相应的htm静态页面代码
Jun 07 PHP
PHP6 中可能会出现的新特性预览
Apr 04 PHP
PHP队列用法实例
Nov 05 PHP
PHP读取文件内容的五种方式
Dec 28 PHP
PHP会员找回密码功能的简单实现
Sep 05 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
Nov 16 PHP
Thinkphp开发--集成极光推送
Sep 15 PHP
PHP中一个有趣的preg_replace函数详解
Aug 15 PHP
yii2的restful api路由实例详解
May 14 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
Drupal7 form表单二次开发要点与实例
2014/03/02 PHP
浅谈php7的重大新特性
2015/10/23 PHP
PHP设计模式之工厂模式定义与用法详解
2018/04/03 PHP
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
JavaScript:Div层拖动效果实例代码
2013/08/06 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
jquery form 加载数据示例
2014/04/21 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
JS控制伪元素的方法汇总
2016/04/06 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
2016/04/18 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
layui表单验证select下拉框实现验证的方法
2019/09/05 Javascript
python中常用的各种数据库操作模块和连接实例
2014/05/29 Python
深入Python解释器理解Python中的字节码
2015/04/01 Python
python 链接和操作 memcache方法
2017/03/04 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
2018/01/24 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
python的pytest框架之命令行参数详解(下)
2019/06/27 Python
django如何自己创建一个中间件
2019/07/24 Python
利用Python代码实现一键抠背景功能
2019/12/29 Python
python如何实现单链表的反转
2020/02/10 Python
TensorBoard 计算图的查看方式
2020/02/15 Python
Python3中的f-Strings增强版字符串格式化方法
2020/03/04 Python
Python网络爬虫四大选择器用法原理总结
2020/06/01 Python
Python用来做Web开发的优势有哪些
2020/08/05 Python
澳大利亚二手奢侈品网站:Modsie
2019/09/23 全球购物
《威尼斯的小艇》教学反思
2014/02/17 职场文书
正风肃纪剖析材料
2014/09/30 职场文书
党的群众路线教育实践活动党员个人剖析材料
2014/10/08 职场文书
入党积极分子十八届四中全会思想汇报
2014/10/23 职场文书
信贷客户经理岗位职责
2015/04/09 职场文书
MySQL命令无法输入中文问题的解决方式
2021/08/30 MySQL
使用canvas对video视频某一刻截图功能
2021/09/25 HTML / CSS
Win11 Build 22000.51版本文件资源管理器“命令栏”和上下文菜单有什么新变化?
2021/11/21 数码科技