基本继承
本课属于 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 ballDog 类会自动获得 Animal 中的 $name 属性、构造函数和 speak() 方法。它还定义了自己的 fetch() 方法,只有狗才有这个方法。
这样就形成了清晰的层级关系:每只狗都是一种动物,因此让 Dog 继承 Animal 是合理的。子类可以使用父类中的所有内容,同时添加自己的专属行为。
要点:继承能促进代码复用,并建立类之间的逻辑关系。子类会继承父类的所有公共成员和受保护成员,从而减少重复,让代码更易于维护。
挑战
简单让我们构建一个车辆继承体系,演示继承如何让子类共享父类的功能,同时添加各自的专属行为。
你要将代码分成三个文件:
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() 的结果
?>这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: PHP 在线编译器