PHP - 继承:初学者指南

你好,未来的PHP法师们!今天,我们将踏上一段激动人心的旅程,探索PHP继承的奥秘。如果你是编程新手,不用担心——我将作为你友好的向导,一步步解释所有内容。那么,拿起一杯咖啡(或者茶,如果你喜欢的话),让我们一起深入吧!

PHP - Inheritance

什么是继承?

继承就像是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 叫唤:汪汪汪!

在这个例子中,我们有两个类:AnimalDogDog类扩展了Animal类,这意味着它继承了Animal类的所有属性和方法。

让我们分解一下:

  1. 我们定义了一个基类Animal,它有一个$name属性和一个speak()方法。
  2. 我们创建了一个Dog类,它使用extends关键字扩展了Animal
  3. Dog类覆盖了speak()方法,提供了自己的实现。
  4. 我们创建了一个名为"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

在这个例子中:

  1. Vehicle类有不同的访问修饰符的属性。
  2. Car类扩展了Vehicle并添加了自己的属性($doors)。
  3. Car类可以访问Vehicle的public和protected成员,但不能访问private成员。
  4. 我们使用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

这里发生了什么:

  1. 当我们创建一个Circle对象时,PHP首先调用Shape构造函数(父类)。
  2. 然后它调用Circle构造函数。
  3. 我们使用parent::__construct($color)来确保调用了Shape构造函数并设置了$color属性。
  4. 最后,我们设置Circle类特有的$radius属性。

这确保了父类和子类都被正确初始化。

方法引用表

以下是我们示例中使用的方法的便捷表格:

方法 描述
__construct() 构造函数方法,当创建对象时被调用
speak() 方法,让动物发出声音
getInfo() 方法,获取车辆的基本信息
getSerialNumber() Protected方法,获取车辆的序列号
getFullInfo() 方法,获取汽车的完整信息

结论

继承是PHP中一个强大的工具,它允许我们创建类的层次结构,促进代码的重用和组织。记住,这就像是用乐高积木建造——你从一块基础积木开始,然后在上面不断添加更具体的积木。

在你继续你的PHP之旅时,你会发现使用继承的许多激动人心的方法。继续练习,很快你就能轻松创建复杂而高效面向对象的程序!

祝编程愉快,未来的PHP大师们!??‍??‍?

Credits: Image by storyset