上一节我们详细介绍了PHP中的访问修饰符,本节我们将学习PHP类中的继承。

1. 在PHP中,什么是类的继承?

答:使用extends关键字,通过在子类的类声明中使用extends关键字,可以指定子类继承自哪个父类。比如:

<?php
/* PHP中类的继承 */
class Base // 父类
{
    public $str = '父类变量';   
    public function f() {
        echo '父类方法';
    }
}
/* 开始继承,子类通过关键字extends继承父类 */
class Son extends Base // 子类
{
    // 注意:PHP子类构造函数中不需要强制调用parent::__construct()
    // 除非父类构造函数有重要逻辑需要执行
}
/* 通过继承,子类获得父类的属性和方法 */
$son = new Son();
echo $son->str; // 输出:父类变量
echo '<br>';
$son->f();      // 输出:父类方法
?>

明明子类什么都没有,但是我们可以通过继承获取父类公共(public)的属性和方法,所以我们可以看到子类能够输出:

获取父类公共属性和方法


2. 继承有什么用?

答:通过继承的方式,子类能够获得父类的属性和方法,并且可以在父类的基础上进行扩展或约束,减少重复编码,提高代码的可读性。

比如此时子类需要一个speak()函数说话(功能扩展),并让f()函数输出"子类方法"(方法重写),我们可以这样做:

<?php
/* PHP中子类对继承的属性的适配,通过方法重写和属性覆盖实现 */
class Base // 父类
{
    public $str = '父类变量';
    
    public function f() {
        echo '父类方法' ;
    }
}
/* 开始继承,子类通过关键字extends继承父类 */
class Son extends Base // 子类
{
    // 覆盖父类属性
    public $str = '子类变量';
    
    /* 通过重写同名方法来进行覆盖,实现子类适配的效果 */
    public function f() {
        echo '子类方法' ;
    }
    
    /* 功能扩展 - 子类新增方法 */
    public function speak() {
        echo "你好,我是{$this->str}";
    }
}
/* 更改父类继承的属性和方法,进行子类适配 */
$son = new Son();
echo $son->str.'<br>';      // 输出:子类变量
$son->f();           // 输出:子类方法
echo '<br>';
$son->speak();       // 输出:你好,我是子类变量
?>

通过重写属性和方法将从父类继承东西都更改一遍,实现子类个性化:我们可以看到:

子类个性化输出


3. PHP继承的特殊功能:

3. 1 访问父类方法

使用parent::关键字可以访问父类的方法:

<?php
//1. 准备一个父类
class Base {
    public function show() {
        echo "父类方法" .'<br>';
    }
}
//2. 子类继承
class Son extends Base {
//3. 通过parent::父类方法来对父类方法进行扩展
    public function show() {
        // 先调用父类方法
        parent::show();
        // 再添加子类特有逻辑
        echo "子类扩展" .'<br>';
    }
}
$son = new Son();
$son->show();
// 输出:
// 父类方法
// 子类扩展
?>

parent::父类方法

3. 2 构造函数继承(子类需要显式调用父类构造函数,而不是继承父类构造函数)

当父类有构造函数时:

<?php
//1.父类有构造函数
class Base {
    protected $name;
    
    public function __construct($name) {
        $this->name = $name;
        echo "父类构造函数执行" . '<br>';
    }
}
//2. 构造函数的处理(注意:构造函数不会被自动继承!)当父类有构造函数时,子类需要显式处理:
class Son extends Base {
    private $age;
    //2.1 子类先写一个构造函数
    public function __construct($name, $age) {
        //2.2 调用父类构造函数,就可以把父类继承的东西交给父类构造
        parent::__construct($name);
        $this->age = $age;//2.3单独的东西自己构造
        echo "子类构造函数执行". '<br>';
    }
    
    public function show() {
        echo "姓名:{$this->name},年龄:{$this->age}";
    }
}
$son = new Son('Dotcpp_user', 18);
$son->show();
?>

父类继承下来的东西让父类的构造函数自己去初始化好了,子类的东西子类自己构造:

子类能够继承父类构造函数

3.3 继承中的访问控制

<?php
//1. 准备一个父类,有三个属性
class Base {
    public $public = '公有属性';
    protected $protected = '受保护属性';
    private $private = '私有属性';
    
    public function test() {
        echo $this->private . "<br>"; // 父类内部可以访问私有属性
    }
}
//2. 子类继承父类,仅能访问public和protected
class Son extends Base {
    public function show() {
        echo $this->public . "<br>";    // ✓ 可以访问
        echo $this->protected . "<br>"; // ✓ 可以访问(受保护的)
        // echo $this->private . "<br>"; // ✗ 不能访问(私有的)
    }
}
$son = new Son();
$son->show();
// $son->protected; // ✗ 外部不能访问受保护的属性
?>

这里主要是证明子类能够访问父类的protected和public属性,不能访问其private属性。

public和protected


总结:PHP类继承允许我们在不重复编写相似代码的情况下创建具有共同行为的类。子类可以使用父类的功能,并且还可以根据需要重写方法、添加新功能。这种代码的组织方式提高了代码的可维护性和可扩展性

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)