9. 继承

继承作为面向对象的三个重要特性的一个方面,在面向对象的领域有着及其重要的作用,好像没听说哪个面向对象的语言不支持继承。 继承是PHP5面象对象程序设计的重要特性之一,它是指建立一个新的派生类,从一个或多个先前定义的类中继承数据和函数,而且可以重新定义或加进新数据和函数,从而建立了类的层次或等级。说的简单点就是,继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。

在定义和实现一个的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。比如你现在已经有一个“人”这个类了,这个类里面有两个成员属性“姓名和年龄”以及还有两个成员方法“说话的方法和走路的方法“, 如果现在程序需要一个学生的类, 因为学生也是人, 所以学生也有成员属性“姓名和年龄”以及成员方法“说话的方法和走路的方法“,这个时候你就可以让学生类来继承人这个类,继承之后,学生类就会把人类里面的所有的属性都继承过来, 就不用你再去重新声明一遍这些成员属性和方法了, 因为学生类里面还有所在学校的属性和学习的方法,所以在你做的学生类里面有继承自人类里面的属性和方法之外在加上学生特有的”所在学校属性“和”学习的方法“, 这样一个学生类就声明完成了, 继函我们也可以叫作“扩展 ”, 从上面我们就可以看出,学生类对人类进行了扩展, 在人类里原有两个属性和两个方法的基础上加上一个属性和一个方法扩展出来一个新的学生类。

通过继承机制,可以利用已有的数据型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类 ,又称为父类 以及超类 。由已存在的类派生出的新类称为派生类 ,又称为子类

在软件开发中,继承性使所建立的软件具有开放性可扩充性 ,这是信息组织与分类的行之有效的方法,它简化了对象、类的创建工作量,增加了代码的可重性。采用继承性,提供了类的规范的等级结构。通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。

在C++语言中,一个派生可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承 ;从多个基类派生的继承称为多继承

但是PHP和Java语言里面没有多继承,只有单继承,也就是说,一个只能直接从一个类中继承数据, 这就是我们所说的单继承。

例如:下面是“人”的抽象

<?php
// 定义一个“人”类做为父类
class Person {
    // 下面是人的成员属性
    private $name;  //人的名子
    private $sex;   //人的性别
    private $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;
    }
}

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

<?php
class Student {
    // 下面是人的成员属性
    private $name;      // 人的名字
    private $sex;       // 人的性别
    private $age;       // 人的年龄
    private $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 关键字来继承”人”类:

<?php
class Student extends Person {
    private $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中类的继承和构造函数的继承

下一节:类型的访问修饰符允许开发人员对类成员的访问进行限制,这是PHP5的新特性,但却是OOP语言的一个好的特性。而且大多数OOP语言都已支持此特性。PHP5支持如下3种访问修饰符:

1. public:公有的、默认的
2. protected:受保护的
3. private:私有的