Menu
CoddyTech

基本继承

本课属于 Coddy PHP 学习旅程的“面向对象编程”单元。第 21 课,共 91 课。

继承允许一个类从另一个类获取属性和方法。你可以创建一个包含共享功能的基类,让其他类继承它,而不必重复编写相同的代码。

被继承的类称为父类(或基类),继承其他类的类称为子类。你可以使用 extends 关键字建立这种关系:

<?php
class Animal {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
    
    public function speak() {
        return "$this->name makes a sound";
    }
}

class Dog extends Animal {
    public function fetch() {
        return "$this->name fetches the ball";
    }
}

$dog = new Dog("Buddy");
echo $dog->speak() . "\n";
echo $dog->fetch();

输出:

Buddy makes a sound
Buddy fetches the ball

Dog 类会自动获得 Animal 中的 $name 属性、构造函数和 speak() 方法。它还定义了自己的 fetch() 方法,只有狗才有这个方法。

这样就形成了清晰的层级关系:每只狗都是一种动物,因此让 Dog 继承 Animal 是合理的。子类可以使用父类中的所有内容,同时添加自己的专属行为。

要点:继承能促进代码复用,并建立类之间的逻辑关系。子类会继承父类的所有公共成员和受保护成员,从而减少重复,让代码更易于维护。

challenge icon

挑战

简单

让我们构建一个车辆继承体系,演示继承如何让子类共享父类的功能,同时添加各自的专属行为。

你要将代码分成三个文件:

  • Vehicle.php:定义一个 Vehicle 类,作为所有车辆的父类。它应有一个公共的 $brand 属性,以及一个接收并设置品牌的构造函数。添加一个 start() 方法,返回 "[brand] is starting",再添加一个 stop() 方法,返回 "[brand] is stopping"。
  • Motorcycle.php:定义一个继承 Vehicle 的 Motorcycle 类。在文件顶部引入 Vehicle 文件。Motorcycle 类不需要自己的构造函数,因为它会继承父类的构造函数。添加一个 wheelie() 方法,返回 "[brand] is doing a wheelie!"。这是摩托车特有的行为。
  • main.php:引入 Motorcycle 文件(该文件已经引入了 Vehicle)。你会收到一个输入:摩托车的品牌。使用这个品牌创建一个 Motorcycle 对象。依次打印调用 start()、wheelie() 和 stop() 的结果,每个结果单独占一行。

注意,Motorcycle 类会自动继承 Vehicle 的 $brand 属性、构造函数,以及 start() 和 stop() 两个方法。子类只需要定义自己的独特之处,在这个例子中,就是做翘头动作的能力。这就是继承的强大之处:在父类中只编写一次通用功能,让子类复用这些功能并添加各自的专属功能。

亲手试试

<?php
// 引入 Motorcycle 类(它已引入 Vehicle 类)
require_once 'Motorcycle.php';

// 读取输入
$brand = trim(fgets(STDIN));

// TODO: 使用品牌创建一个 Motorcycle 对象

// TODO: 打印 start() 的结果

// TODO: 打印 wheelie() 的结果

// TODO: 打印 stop() 的结果
?>
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: PHP 在线编译器