举例讲解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中存储过程、函数的一些问题
Feb 14 PHP
php 获取本机外网/公网IP的代码
May 09 PHP
php 传值赋值与引用赋值的区别
Dec 29 PHP
php中inlcude()性能对比详解
Sep 16 PHP
解析php addslashes()与addclashes()函数的区别和比较
Jun 24 PHP
php使用Session和文件统计在线人数
Jul 04 PHP
php实现购物车功能(以大苹果购物网为例)
Mar 09 PHP
phpMyAdmin无法登陆的解决方法
Apr 27 PHP
PHP简单实现二维数组赋值与遍历功能示例
Oct 19 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
Apr 10 PHP
使用composer命令加载vendor中的第三方类库 的方法
Jul 09 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 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
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
PHP对象相互引用的内存溢出实例分析
2014/08/28 PHP
8个PHP程序员常用的功能汇总
2014/12/18 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
jquery实现textarea输入字符控制(仿微博输入控制字符)
2013/04/26 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
Node.js 服务器端应用开发框架 -- Hapi.js
2014/07/29 Javascript
Javascript学习笔记之 函数篇(三) : 闭包和引用
2014/11/23 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
2015/07/02 Javascript
分享五个有用的jquery小技巧
2015/10/08 Javascript
微信小程序 增、删、改、查操作实例详解
2017/01/13 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
JavaScript实现三级联动效果
2017/07/15 Javascript
node.js中使用Export和Import的方法
2017/09/18 Javascript
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
jQuery实现飞机大战小游戏
2020/07/05 jQuery
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
详解Typescript里的This的使用方法
2021/01/08 Javascript
[09:37]2018DOTA2国际邀请赛寻真——不懈追梦的Team Serenity
2018/08/13 DOTA
Python表示矩阵的方法分析
2017/05/26 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
详解python tkinter教程-事件绑定
2019/03/28 Python
django 实现celery动态设置周期任务执行时间
2019/11/19 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
2020/02/29 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
美国花布包包品牌:Vera Bradley
2017/08/11 全球购物
汉语专业应届生求职信
2013/10/01 职场文书
大学生毕业自我评价范文分享
2013/11/07 职场文书
淘宝活动总结范文
2014/06/26 职场文书
乡领导班子四风问题对照检查材料
2014/09/25 职场文书
学校食品安全责任书
2015/01/29 职场文书
针对吵架老公保证书
2015/05/08 职场文书