PHP面向对象1.5 继承

在C++中,一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个继承称为多继承。但在PHP中和java语言一样没有多继承,只能使用单继承模式

1. 类的继承应用

使用extends关键字

<?php
//声明一个人类,定义人所具有的所有功能和属性
class Person{
    var $name;
    var $sex;
    var $age;
    function __construct($name="",$sex="男",$age=1){
        $this->name = $name;
        $this->sex = $sex;
        $this->age = $age;
    }

    function say(){
        echo "我的名字:".$this->name.",性别:".$this->sex.".年龄:".$this->age.".<br/>";
    }
    function run(){
        echo $this->name."正在走路.";
    }
}

//声明一个学生类,使用extends关键词扩展继承Person类
class Student extends Person{
    var $school;   //学生类中声明一个学生所在学校school成员属性
    //学生类中声明一个学生可以学习的方法
    function study(){
        echo $this->name."正在".$this->school."学习<br/>";
    }
}

//再声明一个教师类,使用extends关键字扩展(继承)Student类
class Teacher extends Student{
    var $wage; //在教师类中声明一个教师工资的wage成员属性

    //在教师类中声明一个教师可以教学的方法
    function teaching(){
        echo $this->name."正在".$this->school."教学,每月工资为".$this->wage.".<br/>";
    }
}

$teacher1 = new Teacher("张三","男",40);  //创建教师类的对象
$teacher1 -> wage = 300;   //将一个教师类的成员属性wage赋值
$teacher1->say();  //调用教师类的说话方法
$teacher1->study();    //调用教师对象中的学习方法
$teacher1->teaching(); //调用教师对象中的教学方法
// Teacher类中的成员包括从Person和Student类中继承过来的所有成员属性

2. 访问类型控制

公有的访问修饰符public

如果类中的成员没有指定成员访问修饰符,将被视为public

私有的访问修饰符private

私有成员只能在本类中使用,在子类中也不能访问。

保护的访问修饰符 protected

对于该类的子类的及子类的子类都有访问权限,可以进行属性,方法的读写操作。但不能被该类的外部代码所访问,该子类的外部代码也不具有访问其属性和方法的权限。

3.子类中重载父类的方法

      在子类中可以定义和父类同名的方法,因为父类的方法已经在子类中存在,这样子类中就可以把从父类中继承过来的方法重写。
子类重载的方法中可以调用父类中被覆盖的方法的功能。这样就可以在子类重写的方法中继续使用从父类中继承过来并被覆盖的方法。使用parent::方法名调用父类中被覆盖的方法。

<?php php //声明一个人类,定义人所具有的所有功能和属性 class Person{ protected $name; protected $sex; protected $age; function __construct($name="",$sex="男",$age=1){ $this->name = $name; $this->sex = $sex; $this->age = $age; } function say(){ echo "我的名字:".$this->name.",性别:".$this->sex.".年龄:".$this->age.".<br/>"; } } //声明一个学生类,使用extends关键词扩展继承Person类 class Student extends Person{ private $school; //学生类中声明一个学生所在学校school成员属性 //覆盖父类中的构造方法,在参数列表中多添加一个学校属性,用来创建对象并初始化成员属性 function __construct($name="",$sex="男",$age=1,$school=""){ //调用父类中被本方法覆盖的构造方法,为从父类中继承过来的成员属性赋初值 parent::__construct($name,$sex,$age); $this->school = $school; //新添加一条为子类中新声明的成员属性赋初值 } //学生类中声明一个学生可以学习的方法 function study(){ echo $this->name."正在".$this->school."学习<br/>"; } //定义一个和父类中同名的方法,将父类中的说话方法覆盖并重写,多说出所在学校名称 function say(){ parent::say(); //调用父类中被本方法覆盖掉的方法 echo "在".$this->school."学校上学<br/>"; //原有基础的功能上多加一点的功能 } } $student = new Student("张三","男",20,"edu"); //创建一个学生对象,并多传一个学校名称参数 $student->say(); 

注意:

子类覆盖父类的方法时一定要注意,在子类中重写的方法的访问权限一定不能低于父类被覆盖的方法的访问权限。例如如果父类的访问权限是protected。那么在子类中重写的方法的权限就要是protected或public.如果父类的方法是public那么子类中的重写方法只能是public。

你可能感兴趣的:(继承,PHP,面向对象)