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:: 关键字提供了一种访问父类实现的方式。它对于正确地链接构造函数,以及在继承功能的基础上进行扩展而不是重写功能,至关重要。
挑战
简单让我们构建一个产品目录系统,演示子类如何使用 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() 的结果
?>这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: PHP 在线编译器