无忧岛

22 七, 2010

php面向对象OOP编程教程(八) – 类的继承

Posted by: kinglife In: php

继承是怎么一个情况呢?和遗传有点相似,但是又不完全相同,比如儿子可以继承父亲的特征,而且还可以拥有自己的特征;同样的子类可以继承父类的属性和方法,而且还可以拥有自己的属性和方法。但是要注意一点,类的世界里面只有”父子关系“,毕竟类不是真实的动物,会有公的和母的之分,还要交配才产下子类,没有这种事情,这只是一个形象的比喻而已。由一个基本的类派生出另一个类,那么这个基本的类就是父类,它所派生出来的类就叫做子类,所以请看下面。

父类也可以叫超类
子类也可以叫派生类

如果你觉得我有性别歧视的嫌疑,当然你也可以叫它们母类和女类,怎么叫无所谓,反正它们是“单性繁殖”,只要理解这点就可以了。想想平时你接触得最多的文件夹,根目录和子目录的关系就和这个道理差不多了……连我自己都觉得啰嗦了,主要是多照顾初学者朋友们,先上图吧,看看更健康。

在PHP和JAVA等大多数语言中,类只允许单继承,也就是说一个子类只能有一个父类;而在C++等一些语言中,类允许多继承,也就是说一个子类可以有多个父类。我个人觉得单继承更符合现实的逻辑,而且我们现在玩的是PHP的OOP,就不对多继承进行过多的讨论了。

php面向对象-类的单继承

php面向对象-类的单继承

也不妨来看看多继承的图,顺便了解下吧:
php面向对象编程-类的多继承

php面向对象编程-类的多继承

 

前面说了,我个人觉得多继承是不符合现实的逻辑的,就是上图所示的样子.但是多继承这个功能是十分有用的,所以PHP为我们引入了接口,接口可以解决多继承的问题,同时又符合了现实的逻辑.关于接口这个东东,我们会在后面的章节中讲解.

现在图看完了,那么打起精神来看代码吧,为了便于演示和便于大家理解,我把所有属性和方法都声明为了public,再次重声,我们不建议这么做:

class Role //角色类
{
//属性部分
public $role_name; //名字

//方法部分
public function roleTalk() //说话
{
echo $this->role_name.':我会说话
';
}

public function roleFight() //发招
{
echo $this->role_name.':我会发招
';
}
}

class RoleSon extends Role //角色儿子类 继承 角色类
{
//方法部分
public function roleEat() //吃饭(儿子类自己的方法)
{
echo $this->role_name.':我会吃饭(儿子特有)
';
}
}

class RoleGrandson extends RoleSon //角色孙子类 继承 角色儿子类
{
//方法部分
public function roleShit() //拉屎(孙子类自己的方法)
{
echo $this->role_name.':我会拉屎(孙子特有)
';
}
}

//实例化角色类
$brother_chun = new Role();
$brother_chun->role_name = '春哥';
$brother_chun->roleTalk();
$brother_chun->roleFight();

//实例化角色儿子类
$brother_chun_son = new RoleSon();
$brother_chun_son->role_name = '春哥之子';
$brother_chun_son->roleTalk();
$brother_chun_son->roleFight();
$brother_chun_son->roleEat();

//实例化角色孙子类
$brother_chun_grandson = new RoleGrandson();
$brother_chun_grandson->role_name = '春哥之孙';
$brother_chun_grandson->roleTalk();
$brother_chun_grandson->roleFight();
$brother_chun_grandson->roleEat();
$brother_chun_grandson->roleShit();

从上面的代码我们已经可以看出继承一个类的步骤非常简单,在子类的名称后面加上extends关键词,再跟上所要继承的父类的名称即可:


class 子类的名称 extends 父类的名称
{
……
}

我们来看看示例代码的输出结果:

春哥:我会说话
春哥:我会发招
春哥之子:我会说话
春哥之子:我会发招
春哥之子:我会吃饭(儿子特有)
春哥之孙:我会说话
春哥之孙:我会发招
春哥之孙:我会吃饭(儿子特有)
春哥之孙:我会拉屎(孙子特有)

我们能发现子类不但可以继承父类的属性和方法,也可以拥有自己的属性和方法.如果我们尝试用”春哥”去访问子类的特有方法,那么程序就会报错.

“春哥之孙”虽然仅仅是继承了”春哥之子”,但是由于”春哥之子”继承了”春哥”,所以”春哥之孙”同时拥有它两个祖宗的属性和方法.

所以说继承这个东东是十分好用啊,你可以利用一个父类来派生出无数个功能更加强大或有特殊用途的子类来.比如把”人类”定义为一个父类,那么通过类的继承,按照性别就可以派生出”男人类”和”女人类”,按照人品就可以派生出”好人类”和”坏人类”,按照职业就可以派生出”工人类”和”农民类”……如此这般,他们同是人类,但又有各自的特点.

以上,什么代码重用易于维护之类老生常谈的好处我就不多说了,大家自己慢慢体会吧,今天就玩到这里.

作者:hetty 首发地址:http://www.im286.com/thread-4823948-1-1.html

版权所有,转载时必须以链接形式注明作者和原始出处及本声明:KingLife@无忧岛

本文链接: http://www.islandcn.com/post/791.html



No Responses to "php面向对象OOP编程教程(八) – 类的继承"

Comment Form

Flickr PhotoStream

    flickrRSS probably needs to be setup

About

Name:KingLife
Email:lifewz#163.com