20 面向对象编程之继承与多态
在前一章中,我们讨论了面向对象编程中的“类与对象”的基本概念,了解了如何定义类、创建对象以及如何使用它们。在这一章中,我们将深入探讨两个重要的概念:继承
与多态
。这两个特性是面向对象编程中非常核心的部分,能够极大地提高代码的复用性和可维护性。
继承
继承
是一种机制,可以让一个类(子类)继承另一个类(父类)的属性和方法。通过继承,子类可以重用父类的代码,同时也可以扩展或修改父类的功能。
基本语法
在PHP中,继承是通过关键字 extends
来实现的。以下是一个简单的示例:
class Animal {
public function speak() {
return "I am an animal.";
}
}
class Dog extends Animal {
public function speak() {
return "Woof! I am a dog.";
}
}
$animal = new Animal();
echo $animal->speak(); // 输出: I am an animal.
$dog = new Dog();
echo $dog->speak(); // 输出: Woof! I am a dog.
在上面的例子中,Dog
类继承了 Animal
类。虽然 Dog
类继承了 speak
方法,但它重写了这个方法,提供了自己的实现。这就是继承的基本用法。
父类构造函数
在子类的构造函数中,我们也可以调用父类的构造函数。使用 parent::__construct()
关键字即可实现:
class Animal {
public function __construct() {
echo "An animal is created.\n";
}
}
class Dog extends Animal {
public function __construct() {
parent::__construct(); // 调用父类构造函数
echo "A dog is created.\n";
}
}
$dog = new Dog();
// 输出:
// An animal is created.
// A dog is created.
在这个例子中,创建 Dog
对象时,会先调用父类 Animal
的构造函数,然后再调用 Dog
的构造函数。
多态
多态
是指不同类的对象可以通过同一接口调用各自的方法表现不同的行为。多态使得我们可以使用统一的接口来处理不同类型的对象。
实现多态
在PHP中,多态通常是通过方法重写(override)实现的。我们可以创建一个接口或抽象类,声明一些方法,然后在不同的子类中实现这些方法。
接口的定义
interface Animal {
public function speak();
}
class Dog implements Animal {
public function speak() {
return "Woof!";
}
}
class Cat implements Animal {
public function speak() {
return "Meow!";
}
}
使用多态
function makeAnimalSpeak(Animal $animal) {
echo $animal->speak() . "\n";
}
$dog = new Dog();
$cat = new Cat();
makeAnimalSpeak($dog); // 输出: Woof!
makeAnimalSpeak($cat); // 输出: Meow!
在这个例子中,makeAnimalSpeak
函数接受一个 Animal
接口的对象,无论是 Dog
还是 Cat
,都可以通过同一个函数来处理。这就是多态的强大之处。
小结
在本章中,我们学习了 继承
和 多态
的基本概念及用法。通过 继承
,我们可以创建新的类并重用已有的代码;通过 多态
,我们能够使用统一的接口来处理不同类型的对象,提高了代码的灵活性和可扩展性。这些概念是面向对象编程的核心要素,将为我们在下一章的内容—命名空间
—埋下良好的基础。
在接下来的章节中,我们将探讨如何使用命名空间来组织代码,避免命名冲突,并提高代码的可读性和可管理性。