Menu
CoddyTech

parent:: 关键字

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

子类继承父类时,有时需要直接访问父类的方法或属性。parent:: 关键字可以让你在子类中调用父类的实现。

在构造函数中,这尤其有用:子类需要初始化父类的属性,同时也要设置自己的属性:

<?php
class Animal {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

class Dog extends Animal {
    public $breed;
    
    public function __construct($name, $breed) {
        parent::__construct($name);
        $this->breed = $breed;
    }
    
    public function describe() {
        return "$this->name is a $this->breed";
    }
}

$dog = new Dog("Max", "Labrador");
echo $dog->describe();

输出:

Max is a Labrador

通过调用 parent::__construct($name),子类可以复用父类的初始化逻辑,而不必重复编写。如果不调用它,$name 属性就永远不会被设置。

你可以使用 parent:: 调用任意父类方法,而不只是构造函数。当你想扩展某个方法的行为,而不是完全替换它时,这一点尤其重要。

要点:parent:: 关键字提供了一种访问父类实现的方式。它对于正确地链接构造函数,以及在继承功能的基础上进行扩展而不是重写功能,至关重要。

challenge icon

挑战

简单

让我们构建一个产品目录系统,演示子类如何使用 parent:: 关键字扩展父类的功能,正确链接构造函数,并在继承的方法基础上进行扩展。

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

  • Product.php:定义一个作为所有产品基类的 Product 类。它应包含公共属性 $name 和 $price。构造函数接收名称和价格,并设置这两个属性。添加一个 getDetails() 方法,返回 "[name]: $[price]"。
  • ElectronicProduct.php:定义一个继承自 Product 的 ElectronicProduct 类。在文件顶部引入 Product 文件。这个类会添加一个 $warranty 属性(单位为月)。构造函数应接收名称、价格和保修期:使用 parent::__construct() 通过父类初始化名称和价格,然后自行设置保修期。创建一个 getDetails() 方法,在父类的实现基础上进行扩展:调用 parent::getDetails(),并在其后追加 " (Warranty: [warranty] months)"。
  • main.php:引入 ElectronicProduct 文件。你会收到三个输入:产品名称、价格(以字符串形式提供,需转换为浮点数)和保修期(以字符串形式提供,需转换为整数)。使用这些值创建一个 ElectronicProduct,并打印调用 getDetails() 的结果。

这个挑战展示了 parent:: 的真正威力。它不仅能用于链接构造函数,还能用于扩展方法的行为。你的 ElectronicProduct 会重用父类的格式化逻辑,并在此基础上添加自己的详细信息,从而避免代码重复,同时生成更丰富的输出。

亲手试试

<?php
require_once 'ElectronicProduct.php';

// 读取输入
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$warranty = intval(trim(fgets(STDIN)));

// TODO: 使用输入的值创建一个 ElectronicProduct 对象
// 并打印调用 getDetails() 的结果

?>
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: PHP 在线编译器