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


Posted in PHP onSeptember 30, 2009

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”人类里面继承过来。
PHP 相关文章推荐
php 调用远程url的六种方法小结
Nov 02 PHP
PHP 之 写时复制介绍(Copy On Write)
May 13 PHP
php使用fopen创建utf8编码文件的方法
Oct 31 PHP
php实现使用正则将文本中的网址转换成链接标签
Dec 03 PHP
smarty缓存用法分析
Dec 16 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
Dec 18 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
Aug 25 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
Mar 21 PHP
验证坐标在某坐标区域内php代码
Oct 08 PHP
php微信开发之自定义菜单完整流程
Oct 08 PHP
thinkPHP5.0框架环境变量配置方法
Mar 17 PHP
微信小程序 消息推送php服务器验证实例详解
Mar 30 PHP
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
Sep 30 #PHP
php面向对象全攻略 (五) 封装性
Sep 30 #PHP
php面向对象全攻略 (四)构造方法与析构方法
Sep 30 #PHP
php面向对象全攻略 (三)特殊的引用“$this”的使用
Sep 30 #PHP
php面向对象全攻略 (二) 实例化对象 使用对象成员
Sep 30 #PHP
php面向对象全攻略 (一) 面向对象基础知识
Sep 30 #PHP
PHP5 操作MySQL数据库基础代码
Sep 29 #PHP
You might like
如何利用php+mysql保存和输出文件
2006/10/09 PHP
php时间不正确的解决方法
2008/04/09 PHP
PHP设计模式之工厂模式定义与用法详解
2018/04/03 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
2019/07/03 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
javascript编程起步(第七课)
2007/02/27 Javascript
javascript mouseover、mouseout停止事件冒泡的解决方案
2009/04/07 Javascript
JQuery加载图片自适应固定大小的DIV
2013/09/12 Javascript
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
javascript四舍五入函数代码分享(保留后几位)
2013/12/10 Javascript
JavaScript更改字符串的大小写
2015/05/07 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
2016/04/17 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
BootStrap轻松实现微信页面开发代码分享
2016/10/21 Javascript
JS实战篇之收缩菜单表单布局
2016/12/10 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
angular项目中bootstrap-datetimepicker时间插件的使用示例
2018/03/15 Javascript
vue + axios get下载文件功能
2019/09/25 Javascript
[52:41]OG vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/20 DOTA
python实现多线程的方式及多条命令并发执行
2016/06/07 Python
Django开发中复选框用法示例
2018/03/20 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
Window环境下Scrapy开发环境搭建
2018/11/18 Python
python实现高斯(Gauss)迭代法的例子
2019/11/20 Python
pandas的resample重采样的使用
2020/04/24 Python
使用CSS3制作版头动画效果
2020/12/24 HTML / CSS
HTML5新特性之用SVG绘制微信logo
2016/02/03 HTML / CSS
如何使用amaze ui的分页样式封装一个通用的JS分页控件
2020/08/21 HTML / CSS
语文教育专业推荐信范文
2013/11/25 职场文书
电话销售经理岗位职责
2013/12/07 职场文书
会议活动邀请函
2014/01/27 职场文书
运动会方队口号
2014/06/07 职场文书
区政府领导班子个人对照检查材料
2014/09/25 职场文书
瞿秋白纪念馆观后感
2015/06/10 职场文书
小学大队长竞选稿
2015/11/20 职场文书