举例讲解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和oracle数据库性能比较
Oct 09 PHP
用php将任何格式视频转为flv的代码
Sep 03 PHP
PHP 文件编程综合案例-文件上传的实现
Jul 03 PHP
PHP加密扩展库Mcrypt安装和实例
Nov 10 PHP
php实现的zip文件内容比较类
Sep 24 PHP
PHP使用递归方式列出当前目录下所有文件的方法
Jun 02 PHP
php获取文件类型和文件信息的方法
Jul 10 PHP
WordPress中限制非管理员用户在文章后只能评论一次
Dec 31 PHP
php脚本运行时的超时机制详解
Feb 17 PHP
Linux下编译redis和phpredis的方法
Apr 07 PHP
php正则判断是否为合法身份证号的方法
Mar 16 PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 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
php中++i 与 i++ 的区别
2012/08/08 PHP
php模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
php导出word格式数据的代码实例
2013/11/25 PHP
YII路径的用法总结
2014/07/09 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
js调试工具Console命令详解
2014/10/21 Javascript
JS实现仿京东淘宝竖排二级导航
2014/12/08 Javascript
AngularJS入门(用ng-repeat指令实现循环输出
2016/05/05 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
JavaScript如何对图片进行黑白化
2018/04/10 Javascript
JavaScript链式调用实例浅析
2018/12/19 Javascript
详解elementui之el-image-viewer(图片查看器)
2019/08/30 Javascript
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
python求众数问题实例
2014/09/26 Python
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
Python 使用requests模块发送GET和POST请求的实现代码
2016/09/21 Python
python+selenium实现登录账户后自动点击的示例
2017/12/22 Python
Windows上使用Python增加或删除权限的方法
2018/04/24 Python
Python 字符串与二进制串的相互转换示例
2018/07/23 Python
python全栈知识点总结
2019/07/01 Python
Django 反向生成url实例详解
2019/07/30 Python
python点击鼠标获取坐标(Graphics)
2019/08/10 Python
pycharm 添加解释器的方法步骤
2020/08/31 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
CSS3.0实现霓虹灯按钮动画特效的示例代码
2021/01/12 HTML / CSS
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
在线学习西班牙语、法语或其他语言:Babbel.com
2018/02/07 全球购物
.NET面试10题
2014/02/24 面试题
园林设计师自荐信
2013/11/18 职场文书
护理个人求职信范文
2014/01/08 职场文书
家长评语大全
2014/01/22 职场文书
起诉书范文
2015/05/20 职场文书
《绝招》教学反思
2016/02/20 职场文书
vue基于Teleport实现Modal组件
2021/05/31 Vue.js