PHP - 继承:初学者指南
你好,未来的PHP法师们!今天,我们将踏上一段激动人心的旅程,探索PHP继承的奥秘。如果你是编程新手,不用担心——我将作为你友好的向导,一步步解释所有内容。那么,拿起一杯咖啡(或者茶,如果你喜欢的话),让我们一起深入吧!
什么是继承?
继承就像是PHP中类的家族树。就像你可能继承了祖母的眼睛或者父亲的幽默感一样,在编程中,一个类可以继承另一个类的属性和方法。这个概念帮助我们编写更有组织和可重用的代码。
想想这个例子:想象你正在创建一个拥有不同角色的视频游戏。所有角色可能都有一些基本特征(比如名字或生命值),但每种类型的角色(比如战士或法师)可能有独特的技能。继承允许我们在一个基类中定义这些共同特征,然后创建特定的角色类,它们继承这些特征并添加自己独特的内容。
基本继承示例
让我们从一个简单的例子开始,看看PHP中的继承是如何工作的。
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
echo "这个动物发出了声音。";
}
}
class Dog extends Animal {
public function speak() {
echo $this->name . " 叫唤:汪汪汪!";
}
}
$myDog = new Dog("Buddy");
$myDog->speak(); // 输出:Buddy 叫唤:汪汪汪!
在这个例子中,我们有两个类:Animal
和Dog
。Dog
类扩展了Animal
类,这意味着它继承了Animal
类的所有属性和方法。
让我们分解一下:
- 我们定义了一个基类
Animal
,它有一个$name
属性和一个speak()
方法。 - 我们创建了一个
Dog
类,它使用extends
关键字扩展了Animal
。 -
Dog
类覆盖了speak()
方法,提供了自己的实现。 - 我们创建了一个名为"Buddy"的新
Dog
对象,并调用它的speak()
方法。
Dog
类从Animal
继承了$name
属性,但提供了自己的speak()
方法版本。这被称为方法覆盖,是继承的一个强大特性。
继承和访问修饰符
现在,让我们讨论继承如何与不同的访问修饰符(public、protected和private)一起工作。
class Vehicle {
public $brand;
protected $model;
private $serialNumber;
public function __construct($brand, $model, $serialNumber) {
$this->brand = $brand;
$this->model = $model;
$this->serialNumber = $serialNumber;
}
public function getInfo() {
return "品牌: " . $this->brand . ",型号: " . $this->model;
}
protected function getSerialNumber() {
return $this->serialNumber;
}
}
class Car extends Vehicle {
public $doors;
public function __construct($brand, $model, $serialNumber, $doors) {
parent::__construct($brand, $model, $serialNumber);
$this->doors = $doors;
}
public function getFullInfo() {
return $this->getInfo() . ",门数: " . $this->doors . ",序列号: " . $this->getSerialNumber();
}
}
$myCar = new Car("Toyota", "Corolla", "ABC123", 4);
echo $myCar->getFullInfo();
// 输出:品牌: Toyota,型号: Corolla,门数: 4,序列号: ABC123
在这个例子中:
-
Vehicle
类有不同的访问修饰符的属性。 -
Car
类扩展了Vehicle
并添加了自己的属性($doors
)。 -
Car
类可以访问Vehicle
的public和protected成员,但不能访问private成员。 - 我们使用
parent::__construct()
来调用父类的构造函数。
记住:
- Public成员可以从任何地方访问。
- Protected成员可以在类及其子类内部访问。
- Private成员只能在定义它们的类内部访问。
构造函数在继承中
让我们更深入地了解构造函数在继承中是如何工作的:
class Shape {
protected $color;
public function __construct($color) {
$this->color = $color;
echo "Shape构造函数被调用。<br>";
}
}
class Circle extends Shape {
private $radius;
public function __construct($color, $radius) {
parent::__construct($color);
$this->radius = $radius;
echo "Circle构造函数被调用。<br>";
}
public function getInfo() {
return "一个{$this->color}颜色的圆,半径为{$this->radius}";
}
}
$myCircle = new Circle("red", 5);
echo $myCircle->getInfo();
输出:
Shape构造函数被调用。
Circle构造函数被调用。
一个red颜色的圆,半径为5
这里发生了什么:
- 当我们创建一个
Circle
对象时,PHP首先调用Shape
构造函数(父类)。 - 然后它调用
Circle
构造函数。 - 我们使用
parent::__construct($color)
来确保调用了Shape
构造函数并设置了$color
属性。 - 最后,我们设置
Circle
类特有的$radius
属性。
这确保了父类和子类都被正确初始化。
方法引用表
以下是我们示例中使用的方法的便捷表格:
方法 | 描述 |
---|---|
__construct() |
构造函数方法,当创建对象时被调用 |
speak() |
方法,让动物发出声音 |
getInfo() |
方法,获取车辆的基本信息 |
getSerialNumber() |
Protected方法,获取车辆的序列号 |
getFullInfo() |
方法,获取汽车的完整信息 |
结论
继承是PHP中一个强大的工具,它允许我们创建类的层次结构,促进代码的重用和组织。记住,这就像是用乐高积木建造——你从一块基础积木开始,然后在上面不断添加更具体的积木。
在你继续你的PHP之旅时,你会发现使用继承的许多激动人心的方法。继续练习,很快你就能轻松创建复杂而高效面向对象的程序!
祝编程愉快,未来的PHP大师们!?????
Credits: Image by storyset