四时宝库

程序员的知识宝库

PHP 类继承和覆盖(php中类的继承关键字是)

加载父类中的构造函数

parent::__construct($name,$sex,$age); 不需要重新赋值

加载父类中的方法:

parent::say();

详细使用方法:

Bash
function say() {
    parent::say(); //调用父类中被本方法覆盖掉的方法
    echo "在".$this->school."学校上学<br>"; //再原有的功能基础上多加一点功能
}

实例:

Bash
<?php
class Person { //声明一个人类,定义人所具有的一些其本的属性和功能成员,做为父类
    protected $name; //声明一个存储人的名子的成员
    protected $sex; //声明一个存储人的性别的成员
    protected $age; //声明一个存储人的年龄的成员

    function __construct($name="", $sex="男", $age=1) { //构造方法用来创建对象并初使化成员属性
        $this->name = $name; //为成员属性name在创建对象时赋初值
        $this->sex = $sex; //为成员属性sex在创建对象时赋初值
        $this->age = $age; //为成员属性age在创建对象时赋初值
    }
    protected function say(){ //在人类在声明一个通用的说话方法,介绍一下自己
        echo "我的名字叫:".$this->name.", 性别:".$this->sex.", 我的年龄是:".$this->age."。<br>";
    }
}
class Student extends Person { //声明一个学生类,使用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(); //调用学生类中覆盖父类的说话方法
?>

子类中没有定义构造方法时, 会自动调用父类的构造方法。因此实例化子类时, 需按照父类的构造方法的形式进行。

子类定义了自己的构造方法, 则不会自动调用父类的构造方法, 但可以手动调用:parent::__construct();

子类中没有定义析构方法时, 会自动调用父类的析构方法。

子类定义了自己的析构方法, 则不会自动调用父类的析构方法, 但可以手动调用:parent::__destruct()

PHP中的继承

继承:子类继承父类所有的属性和非私有的方法,常量也可以被继承

属性的继承: 子类继承父类所有的属性(公有的和私有的), 但在子类中不能访问私有属性;

常量的继承: 子类可以继承父类的常量;

方法的继承: 子类继承父类的非私有的方法, 但在子类中不能访问私有属性;

覆盖的注意事项:

只有保护的或公有的属性或方法能够被覆盖, --也可以说, 只有保护的或公有的属性或方法才可以被"继承"下来。

私有的属性或方法有如下2个情况:

私有的属性和方法能被继承下来, 但不能访问(要想能够被访问, 必须在父类中定义公有的方法, 访问私有的属性与方法);

从访问控制角度来说, 私有的不能在其继承的类中访问(只能在自己类中访问);

实例1:

Bash
<?php
header("Content-type: text/html; charset=utf-8");
class father{
    public $name = "父亲";
    protected $age = "50";
    private $monkey = "5000";
    public function getson(){
        echo $this->name."<br>";
        echo $this->age."<br>";
        echo $this->monkey."<br>";
    }
}
class son extends father{
    public $name = "儿子";
    protected $age = "20";
    private $monkey = "4000";

}
$son = new son();
echo "<pre>";
var_dump($son);
echo "</pre>";
/*
object(son)#1 (4) {
["name"]=>
string(6) "儿子"
["age":protected]=>
string(2) "20"
["monkey":"son":private]=>
string(4) "4000"
["monkey":"father":private]=>
string(4) "5000"
}
*/
$son->getson(); //从父类中继承的方法
/*
儿子
20
5000
*/
$father = new father();
$father->getson(); //父类中的方法
/*
父亲
50
5000
*/
?>

实例2:

Bash
<?php
//定义一个学校的多种人员角色
class Member{
    public $name = "";
    public $age ;
    protected $age2 = 2; //跟age对比
    private $age3 = 3; //跟age对比
function __construct($n, $a){
    $this->name = $n;
    $this->age = $a;
}
public function showInfo(){ //在父类中定义公有的方法
    echo "<br />我叫{$this->name},";
    echo "今年{$this->age}岁";
    echo "<br />age2:" . $this->age2;
    echo "<br />age3:" . $this->age3;
    }
}
class Student extends Member{
    public $major = "PHP"; //专业
    function __construct($n, $a, $m){
    parent::__construct($n, $a);
    $this->major = $m;
		}
		public function showInfo(){ //这里是子类的showInfo
        parent::showInfo(); //这里使用了父类的showInfo()方法
        echo "<br />我的专业为:" . $this->major;
        echo "<br />子类中访问age:" . $this->age;
        echo "<br />子类中访问age2:" . $this->age2;
        echo "<br />子类中访问age3:" . $this->age3; //报错, 父类中的私有属性是不能使用
    } 
}
$s1 = new Student("小明", 22, 'java');
$s1->showInfo();
?>

继承链

可以通过链式继承

一个类在一个文件里面被声明过之后, 不能再次声明, 跟在一个类里面不允许有同名函数类似。

Bash
<?php
//PHP中的继承链条
class A{
    public $name1 = "A";
}
class B extends A{
    public $name = "B";
}
class C extends B{
}
$c = new C();
var_dump($c);
?>

object(C)#1 (2) { ["name"]=> string(1) "B" ["name1"]=> string(1) "A" }

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接