php面向对象全攻略 (七) 继承性

11.类的继承
继承作为面向对象的三个重要特性的一个方面,在面向对象的领域有着极其重要的作用,
好像没听说哪个面向对象的语言不支持继承。继承是PHP5 面向对象程序设计的重要特性之
一,它是指建立一个新的派生类,从一个或多个先前定义的类中继承数据和函数,而且可以
重新定义或加进新数据和函数,从而建立了类的层次或等级。说的简单点就是,继承性是子
类自动共享父类的数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的
时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为
自己的内容,并加入若干新的内容。比如你现在已经有一个“人”这个类了,这个类里面有
两个成员属性“姓名和年龄”以及还有两个成员方法“说话的方法和走路的方法”,如果现在
程序需要一个学生的类,因为学生的也是人,所以学生也有成员属性“姓名和年龄”以及成
员方法“说话的方法和走路的方法”,这个时候你就可以让学生类来继承人这个类,继承之后,
学生类就会把人类里面的所有的属性都继承过来,就不用你再去重新声明一遍这些成员属性
和方法了,因为学生类里面还有所在学校的属性和学习的方法,所以在你做的学生类里面有
继承自人类里面的属性和方法之外在加上学生特有的“所在学校属性”和“学习的方法”,
这样一个学生类就声明完成了,继承我们也可以叫做“扩展”,从上面我们就可以看出,学生
类对人类进行了扩展,在人类里原有两个属性和两个方法的基础上加上一个属性和一个方法
扩展出来一个新的学生类。
通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型
不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基
类,又称为父类以及超类。由已存在的类派生出的新类称为派生类,又称为子类。
在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性,这是信息组织与分
类的行之有效的方法,它简化了对象、类的创建工作量,增加了代码的可重性。采用继承性,
提供了类的规范的等级结构。通过类的继承关系,使公共的特性能够共享,提高了软件的重
用性。
在C++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。
但是在PHP 和Java 语言里面没有多继承,只有单继承,也就是说,一个类只能直接从
一个类中继承数据,这就是我们所说的单继承。
例如:
下面是“人”类的抽象
代码片段


代码如下:

//定义一个“人”类作为父类
class Person{
//下面是人的成员属性
var $name; //人的名子
var $sex; //人的性别
var $age; //人的年龄
//定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
function __construct($name, $sex, $age){
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}
//这个人可以说话的方法, 说出自己的属性
function say() {
echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>";
}
}

下面我们做一个“学生类”,如果不是用继承如下:代码片段


代码如下:

//定义一个“人”类做为父类
class Student{
//下面是人的成员属性
var $name; //人的名子
var $sex; //人的性别
var $age; //人的年龄
var $school; //学生所在学校的属性
//定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
function __construct($name=””, $sex=””, $age=””, $school=””){
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
$this->school=$school;
}
//这个人可以说话的方法, 说出自己的属性
function say() {
echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>";
}
//这个学生学习的方法
function study() {
echo "我的名子叫:".$this->name." 我正在”.$this->school.”学习<br>";
}
}
//定义一个子类“学生类“使用”extends”关键字来继承”人”类
class Student extends Person{
var $school; //学生所在学校的属性
//这个学生学习的方法
function study() {
echo "我的名子叫:".$this->name." 我正在”.$this->school.”学习<br>";
}
}

通过上面“Student”类的定义,Student 类通过使用“extends”这个关键字把Person 类
里的所有成员属性和成员方法都继承过来了,并扩展了一个所在学校成员属性“school”,和
一个学习方法“study()”。现在子类“Student”里面和使用这个类实例出来的对象都具有如下
的属性和方法:
学生类“Student”里面的成员属性有:
姓名:name;
年龄:age;
性别:sex;
学校:school;
学生类“Student”里面的成员方法有:
说话方法:say();
学习方法:study();
通过上面类继承的使用简化了对象、类的创建工作量,增加了代码的可重性。但是从上
面这一个例子上中“可重用性”以及其它的继承性所带来的影响,我们看的还不是特别的明
显,你扩展的去想一下,人有无数个岗位,比如上面的学生还有老师、工程师、医生、工人
等,很多很多,如果每个类都定义“人”都共同具有的属性和方法,想一想会有很大的工作
量,这些属性和方法都可以从“Person”人类里面继承过来。

时间: 2009-09-29

PHP面向对象程序设计之接口用法

接口是PHP面向对象程序设计中非常重要的一个概念.本文以实例形式较为详细的讲述了PHP接口的用法.具体如下: 接口:interface 在PHP中,我们可以规定,一个对象应该具有哪些公共的外部操作,即可使用interface来规定. 公共的方法就是接口.用于规定一个对象应该用于哪些公共的操作方法(接口),这个也叫接口(公共操作方法的集合) 即:接口(interface结构,公共方法集合) 公共方法(接口方法) 定义:用于限定某个对象所必须拥有的公共操作方法的一种结构,称之为接口(interfac

PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程

1.PHP中的抽象类 PHP 5 支持抽象类和抽象方法.定义为抽象的类不能被实例化.任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的.被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现.在类的声明中使用 abstract 修饰符可以将某个类声明为抽象的. 可以这样理解,抽象类作为一个基类,它把特定的细节留给继承者来实现.通过抽象概念,可以在开发项目中创建扩展性很好的架构. 复制代码 代码如下: abstract class Abstrac

php学习笔记 面向对象中[接口]与[多态性]的应用

复制代码 代码如下: <?php /* 接口技术 * * 接口是一种特殊的抽象类,抽象类又是一种特殊的类 * * 接口和抽象类是一样的作用 * * 因为在PHP是单继承的,如果使用抽象类,子类实现抽象类就不能再去继承其他的类了 * * 如果既想实现一些规范,又想继承其他类.就要使用接口. * * 接口和抽象类的对比 * * 1.作用相同,都不能创建对象,都需要子类去实现 * * 2.接口的声明和抽象类不一样 * * 3.接口被实现方式不一样 * * 4.接口中的所有方法必须是抽象方法,只能声明抽

PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)

本文实例讲述了PHP面向对象的特性.分享给大家供大家参考,具体如下: Demo1.php <?php header('Content-Type:text/html; charset=utf-8;'); //创建一个电脑类 class Computer { //什么叫做类内,就是创建类的花括号内的范围叫做类内,其他地方则类外. //public 是对字段的公有化,这个字段类外即可访问,赋值和取值 public $_name = '联想'; } $computer = new Computer();

php面向对象全攻略 (十四) php5接口技术

20.PHP5 接口技术 PHP 与大多数面向对象编程语言一样,不支持多重继承.也就是说每个类只能继承一个父 类.为了解决这个问题,PHP 引入了接口,接口的思想是指定了一个实现了该接口的类必须 实现的一系列方法.接口是一种特殊的抽象类,抽象类又是一种特殊的类,所以接口也是一 种特殊的类,为什么说接口是一种特殊的抽象类呢?如果一个抽象类里面的所有的方法都是 抽象方法,那么我们就换一种声明方法使用"接口":也就是说接口里面所有的方法必须都是 声明为抽象方法,另外接口里面不能声明变量,而且

PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)

本文实例讲述了PHP面向对象程序设计高级特性.分享给大家供大家参考,具体如下: 静态属性 <?php class StaticExample { static public $aNum = 0; // 静态共有属性 static public function sayHello() { // 静态共有方法 print "hello"; } } print StaticExample::$aNum; StaticExample::sayHello(); ?> 输出:0   

PHP面向对象的进阶学习(抽像类、接口、final、类常量)

一.抽像类(abstract) 在我们实际开发过程中,有些类并不需要被实例化,如前面学习到的一些父类,主要是让子类来继承,这样可以提高代码复用性 语法结构: 复制代码 代码如下: abstract class 类名{ 属性 $name; 方法(){} //方法也可以为abstract 修饰符 function 方法名(){} } 例: 复制代码 代码如下: abstract class animal{ public $name; public $age; //抽象方法不能有方法体,主要是为了让子

PHP面向对象程序设计OOP继承用法入门示例

本文实例讲述了PHP面向对象程序设计OOP继承用法.分享给大家供大家参考,具体如下: <?php class Person { var $name;//protected var $sex; var $age; function __construct($name = "", $sex = "男", $age = 22) { $this->name = $name; $this->sex = $sex; $this->age = $age;

PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)

面象对向的三大特点:封装性.继承性.多态性 首先简单理解一下抽象:我们在前面定义一个类的时候,实际上就是把一类事物共有的属性和行为提取出来,形成一个物理模型(模版),这种研究问题的方法称为抽象一.封装性 封装就是把抽取出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有被授权的操作(方法)才能对数据进行操作. php提供了三种访问控制修饰符 public 表示全局,本类内部,类外部,子类都可以访问 protected 表示受保护的,只有本类或子类可以访问 private 表示

PHP面向对象继承用法详解(优化与减少代码重复)

本文实例讲述了PHP面向对象继承用法.分享给大家供大家参考,具体如下: 继承 先看两个类 <?php class CdProduct { public $playLength; // 播放时间 public $title; public $producerMainName; public $producerFirstName; public $price; function __construct( $title, $firstName, $mainName, $price, $playLeng

PHP接口继承及接口多继承原理与实现方法详解

本文实例讲述了PHP接口继承及接口多继承原理与实现方法.分享给大家供大家参考,具体如下: 在PHP的接口中,接口可以继承接口.虽然PHP类只能继承一个父类(单继承),但是接口和类不同,接口可以实现多继承,可以继承一个或者多个接口.当然接口的继承也是使用extends关键字,要多个继承的话只要用逗号把继承的接口隔开即可. 需要注意的是当你接口继承其它接口时候,直接继承父接口的静态常量属性和抽象方法,所以类实现接口时必须实现所有相关的抽象方法. 现在你对PHP接口的继承有所了解了吧,下面的例子可供参

ThreadPoolExecutor线程池原理及其execute方法(详解)

jdk1.7.0_79 对于线程池大部分人可能会用,也知道为什么用.无非就是任务需要异步执行,再者就是线程需要统一管理起来.对于从线程池中获取线程,大部分人可能只知道,我现在需要一个线程来执行一个任务,那我就把任务丢到线程池里,线程池里有空闲的线程就执行,没有空闲的线程就等待.实际上对于线程池的执行原理远远不止这么简单. 在Java并发包中提供了线程池类--ThreadPoolExecutor,实际上更多的我们可能用到的是Executors工厂类为我们提供的线程池:newFixedThreadP

Python堆排序原理与实现方法详解

本文实例讲述了Python堆排序原理与实现方法.分享给大家供大家参考,具体如下: 在这里要事先说明一下我也是新手,很多东西我了解不是很深入,写算法完全是锻炼自己逻辑能力同时顺带帮助读研的朋友么解决一些实际问题.所以很多时候考虑的东西不是很全面能请各位看到博文的大牛们指正.对于排序算法说实在的我觉得已经写烂了,但是为什么还是要过一遍呢?还是为了能够打牢基础.说一下自己的看法,对于已经的玩烂的算法因该怎么学.首先最重要的还是了解算法的基本模型和算法思想,我觉得这是非常重要的.其次的话首先先尝试自己实

java的继承原理与实现方法详解

本文实例讲述了java的继承原理与实现方法.分享给大家供大家参考,具体如下: 继承 1.java中是单继承的.每个子类只有一个父类. 语法:子类 extends 父类 2.在java中,即使没有声明父类,也有一个隐含的父类,就是Object类 3.在子类中可以使用super来调用父类的方法 4.继承中的构造方法问题 在new一个子类实例的过程中,会优先自动调用父类默认的无参数构造方法,然后再调用子类的构造方法.如果父类没有默认的构造方法,只有带参数的构造方法,此时就会出错. 除了由jvm自动调用

基于JavaScript实现继承机制之调用call()与apply()的方法详解

call() 方法call() 方法是与经典的对象冒充方法最相似的方法.它的第一个参数用作 this 的对象.其他参数都直接传递给函数自身.例如: 复制代码 代码如下: function sayHello(sPrefix,sSuffix) {    alert(this.name + "says" + sPrefix + sSuffix);}; var obj = new Object();obj.name = "Tom"; sayHello.call(obj, &

Python封装原理与实现方法详解

本文实例讲述了Python封装原理与实现方法.分享给大家供大家参考,具体如下: [封装] 隐藏对象的属性和实现细节,仅对外提供公共访问方式. [好处] 1. 将变化隔离: 2. 便于使用: 3. 提高复用性: 4. 提高安全性: [封装原则] 1. 将不需要对外提供的内容都隐藏起来: 2. 把属性都隐藏,提供公共方法对其访问. 私有变量和私有方法 在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) 私有变量 #其实这仅仅这是一种变形操作 #类中所有双下划线开头的名称如__x都会自

java图片滑动验证(登录验证)原理与实现方法详解

本文实例讲述了java图片滑动验证(登录验证)原理与实现方法.分享给大家供大家参考,具体如下: 这是我简单做出的效果图,处理300X150px的校验图,并把图片发到前端,用时50毫秒左右,速度还是非常快的. 原理: 1.利用java从大图中随机抠出一张小图,并在大图上给抠出小图的位置加阴影,然后把这两张图片返回给前端: 2.前端获取图片,用户滑动小图到阴影的位置,获取小图滑动的距离,返回给java后台进行校验: 3.校验通过,返回校验通过编号: 4.前端调登录接口,把账号.密码.和校验编号传到J

PHP高级编程之消息队列原理与实现方法详解

本文实例讲述了PHP高级编程之消息队列原理与实现方法.分享给大家供大家参考,具体如下: 1. 什么是消息队列 消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式 2. 为什么使用消息队列 消息队列技术是分布式应用间交换信息的一种技术.消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读出.通过消息队列,应用程序可独立地执行,它们不需要知道彼此的位置.或在继续执行前不需要等待接收程序接收此消息. 3. 什么场合使用消息队列 你首先需要弄清楚,消息

JS前端模块化原理与实现方法详解

本文实例讲述了JS前端模块化原理与实现方法.分享给大家供大家参考,具体如下: 1.什么是前端模块化 模块化开发,一个模块就是一个实现特定功能的文件,有了模块我们就可以更方便地使用别人的代码,要用什么功能就加载什么模块. 2.模块化开发的好处 1)避免变量污染,命名冲突 2)提高代码利用率 3)提高维护性 4)依赖关系的管理 3.前端模块化的进程 前端模块化规范从原始野蛮阶段现在慢慢进入"文艺复兴"时代,实现的过程如下: 3.1 函数封装 我们在讲到函数逻辑的时候提到过,函数一个功能是实

Java二叉搜索树基础原理与实现方法详解

本文实例讲述了Java二叉搜索树基础原理与实现方法.分享给大家供大家参考,具体如下: 前言:本文通过先通过了解一些二叉树基础知识,然后在转向学习二分搜索树. 1 树 1.1 树的定义 树(Tree)是n(n>=0)个节点的有限集.n=0时称为空树.在任意一颗非空树中: (1)有且仅有一个特定的称为根(Root)的节点: (2)当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1.T2........Tn,其中每一个集合本身又是一棵树,并且称为根的子树. 此外,树的定义还需要强调以