多态是面向对象的三大特性中除封装和继承之外的另一重要特性。它展现了动态绑定的功能,也称为“同名异式”。多态的功能可让软件在开发和维护时,达到充分的延伸性。事实上,多态最直接的定义是让具有继承关系的不同类对象,可以对相同名称的成员函数调用,产生不同反应效果。所谓多态性就是指一段程序能够处理多种类型对象的能力,在PHP中,多态值指的就是方法的重写。方法重写是指一个子类中可以重新修改父类中的某些方法,使其具有自己的特征。重写要求子类的方法和父类的方法名称相同,这可以通过声明抽象类或是接口来规范。
我们通过计算机USB设备的应用来介绍一下面向对象中的多态性,目前USB设置的种类仅我们自己用过的我想就有十几种吧。例如USB鼠标、USB键盘、USB存储设备等,这些计算机的外部设备都是通过USB接口连接到计算机以后,被计算机调用并启动运行的。也就是计算机正常运行的同时,没插入一种不同USB设备,就为计算机扩展一样功能,这正是我们所说的多态特征。那么为什么每个USB设备不一样,但都可以被计算机应用呢?那是因为每个USB设置都要遵守电脑USB接口的开发规范,都具有相同的能被计算机加载到并启用的方法,但运行各自相应的功能。这也正是我们对多态的定义,假设我们有一个主程序已经开发完成,需要后期由其他开发人员为其扩展一些功能,但需要在不改动主程序的基础上就可以加载到这些扩展的功能模块,其实也就是为程序开发一些插件。这就需要在主程序中需要为扩展的插件程序写好接口规范,然后每个插件只有按照规范去实现自己的功能,才能被主程序应用到。在计算机中应用USB设备的程序设计如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
//定义一个USB接口,让每个USB设备都遵守这个规范
interface USB{
function run();
}
 
class Computer{
//计算机类中的一个方法可以应用任何一种USB设备
function useUSB($usb){
$usb->run();
}
}
 
$computer =new Computer;
$computer ->useUSB(new Ukey()); //为计算机插入一个usb键盘设备,并运行
$computer ->useUSB(new Umouse()); //为计算机插入一个usb鼠标设备,并运行
$computer ->useUSB(new Ustore()); //为计算机插入一个usb存储设备,并运行
?>

下面的代码根据USB接口定义的规范,实现了USB键盘、USB鼠标和USB存储三个设备,当然可以去实现更多的USB设置,都按照自己设备的功能重写了run()方法,所以插入计算机启动运行后每个USB设备都有自己的形态。代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
//扩展一个USB键盘设备,实现usb接口
class Ukey implements USB {
function run(){
echo "运行USB键盘设备<br>";
}
}
//扩展一个USB鼠标设备,实现usb接口
class Umouse implements USB {
function run(){
echo "运行USB鼠标设备<br>";
}
}
 
//扩展一个USB存储设备,实现usb接口
class Ustore implements USB {
function run(){
echo "运行USB存储设备<br>";
}
}
?>
 

>> 本文固定链接: http://php.ncong.com/php_course/oop/duotai.html

>> 转载请注明: 恩聪php 2014年07月25日 于 恩聪PHP学习教程 发表

PHP面向对象多态性的应用的更多相关文章

  1. Objective-C面向对象的编程

    Objective-C面向对象的编程 目录 对面向对象编程思想的理解 类的声明和定义 类的声明和定义 对关键字super和self的理解 初始化函数 @property声明类成员 类的实例化 继承 组 ...

  2. Java菜鸟学习笔记--面向对象篇(十八):对象转型&多态

    Polymorphism[多态] 简述: 面向对象多态性指的是:发送消息给某个对象,让该对象自行决定响应何种行为. 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用 多态的三个前提条件: 多 ...

  3. java面向对象的核心思想

    java面向对象的特征之一:封装 1.封装性的使用 package edu.tongji.classdemo; /* 封装性 1.封装的目的:保护某些属性和方法不被外部所见 2.封装的实现 为属性和方 ...

  4. 设计模式学习--面向对象的5条设计原则之Liskov替换原则--LSP

    一.LSP简介(LSP--Liskov Substitution Principle): 定义:如果对于类型S的每一个对象o1,都有一个类型T的对象o2,使对于任意用类型T定义的程序P,将o2替换为o ...

  5. C++标准转换运算符

    C++类型转换在实际编程中会经常使用,其实,本质上对象的类型用来解释(interpret)对象.因为,每个对象都占据一块内存空间,这块内存空间存放了一段二进制数据.通过标记该对象的类型,告诉如何看待这 ...

  6. c++学习笔记之继承篇

    title: c++学习笔记之继承篇 date: 2017-03-26 16:36:33 tags: [c++,继承,public,virtual,private,protected] categor ...

  7. python-工厂方法模式

    源码地址:https://github.com/weilanhanf/PythonDesignPatterns 简单工厂模式的不足: 在简单工厂模式中,只提供了一个工厂类,该工厂类处于对产品类进行实例 ...

  8. C++标准转换运算符dynamic_cast

    dynamic_cast <new_type> (expression) dynamic_cast运算符,应该算是四个里面最特殊的一个,因为它涉及到编译器的属性设置,而且牵扯到的面向对象的 ...

  9. java面试题9

    1.选择题 public class Test01 { public static void changeStr(String str) { str = "welcome"; } ...

随机推荐

  1. 研究了下apache的漏洞CVE-2012-0053

    发一个大cookie过去,最新版本的,竟然显示了个\n 嘛意思 干嘛不直接删掉 Your browser sent a request that this server could not under ...

  2. Search a 2D Matrix ——LeetCode

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  3. HDOJ(HDU) 2088 Box of Bricks(平均值)

    Problem Description Little Bob likes playing with his box of bricks. He puts the bricks one upon ano ...

  4. Java web App 部署静态文件

    以 Tomcat 为例子,静态文件,如 html, css, js ,无需编译,所以只需要把文件复制到 Tomcat/webapps 目录下面某个子目录,便可以了. 例子: 1. 在 Tomcat/w ...

  5. cocos日记

    n/2/2015 ADT       E:\All Setup\eclipse_past\Eclipse_plugins_ADT 15/2/2015 配置cocos win32 开发环境 链接:htt ...

  6. Kernel 4.9的BBR拥塞控制算法。

    重要的事情说三遍! BBR并不能突破带宽限制!!! BBR并不能突破带宽限制!!! BBR并不能突破带宽限制!!! 它的功能如下: 1.在高丢包率与低速率的网络中提升传输效果,充分利用带宽. 2.降低 ...

  7. HDU1159 && POJ1458:Common Subsequence(LCS)

    Problem Description A subsequence of a given sequence is the given sequence with some elements (poss ...

  8. 自定义控件(视图)2期笔记05:自定义控件之继承自View(滑动开关)

    1.  开关按钮点击效果,如下: 2. 继承已有View实现自定义View 3. 下面通过一个案例实现滑动开关的案例: (1)新建一个新的Android工程,命名为" 开关按钮", ...

  9. javascript !!的作用是把一个其他类型的变量转成的bool类型

    !!的作用是把一个其他类型的变量转成的bool类型

  10. Wpf解决TextBox文件拖入问题、拖放问题

    在WPF中,当我们尝试向TextBox中拖放文件,从而获取其路径时,往往无法成功(拖放文字可以成功).造成这种原因关键是WPF的TextBox对拖放事件处理机制的不同, 解放方法如下: 使用Previ ...