举例讲解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 相关文章推荐
ftp类(example.php)
Oct 09 PHP
可定制的PHP缩略图生成程式(需要GD库支持)
Mar 06 PHP
php中设置多级目录session的问题
Aug 08 PHP
php smarty截取中文字符乱码问题?gb2312/utf-8
Nov 07 PHP
php分页思路以及在ZF中的使用
May 30 PHP
Destoon模板制作简明教程
Jun 20 PHP
yii操作session实例简介
Jul 31 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
Jan 22 PHP
PHP中的随机性 你觉得自己幸运吗?
Jan 22 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
Dec 24 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
Feb 04 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
Jun 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
TP5框架简单登录功能实现方法示例
2019/10/31 PHP
laravel框架实现后台登录、退出功能示例
2019/10/31 PHP
JS backgroundImage控制
2009/05/19 Javascript
JavaScript 语言基础知识点总结(思维导图)
2013/11/10 Javascript
jQuery代码性能优化的10种方法
2016/06/21 Javascript
微信小程序 radio单选框组件详解及实例代码
2017/01/10 Javascript
React全家桶环境搭建过程详解
2018/05/18 Javascript
node.js 基于 STMP 协议和 EWS 协议发送邮件
2021/02/14 Javascript
在Python中利用Into包整洁地进行数据迁移的教程
2015/03/30 Python
python实现发送邮件及附件功能
2021/03/02 Python
python如何爬取个性签名
2018/06/19 Python
使用Python读取二进制文件的实例讲解
2018/07/09 Python
使用sklearn之LabelEncoder将Label标准化的方法
2018/07/11 Python
python3.5基于TCP实现文件传输
2020/03/20 Python
pandas 层次化索引的实现方法
2019/07/06 Python
解决Python3下map函数的显示问题
2019/12/04 Python
python3的UnicodeDecodeError解决方法
2019/12/20 Python
Python中if有多个条件处理方法
2020/02/26 Python
CSS3 box-sizing属性详解
2016/11/15 HTML / CSS
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
HTML5中的拖放实现详解
2017/08/23 HTML / CSS
美国在线纱线商店:Darn Good Yarn
2019/03/20 全球购物
酒吧创业计划书
2014/01/18 职场文书
风险评估实施方案
2014/03/09 职场文书
家长学校实施方案
2014/03/15 职场文书
幼儿园小班评语
2014/04/18 职场文书
明确岗位职责
2015/02/14 职场文书
2015年城管个人工作总结范文
2015/04/20 职场文书
离婚案件被告代理词
2015/05/23 职场文书
民间借贷借条范本
2015/05/25 职场文书
应届生们该怎么书写求职信?
2019/07/05 职场文书
浅谈redis五大数据结构和使用场景
2021/04/12 Redis
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python
浅谈Python中的正则表达式
2021/06/28 Python
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL
JavaScript实现外溢动态爱心的效果的示例代码
2022/03/21 Javascript