PHP extends 关键字
最后修改于 2025 年 4 月 16 日
PHP extends
关键字支持类的继承,这是一个基本的面向对象编程 (OOP) 概念。它允许子类继承父类的属性和方法。继承促进了代码重用和层次结构组织。
基本定义
extends
关键字在类之间创建继承关系。子类(子类)继承自父类(超类)。
继承的成员包括公共和受保护的属性和方法。私有成员不会被继承。子类可以重写父类方法。
语法:class Child extends Parent { ... }
。PHP 支持单一继承 - 一个类只能扩展一个父类。
基本继承
此示例演示了使用 extends 关键字的简单类继承。
<?php declare(strict_types=1); class Vehicle { public function startEngine(): void { echo "Engine started.\n"; } } class Car extends Vehicle { public function drive(): void { echo "Car is moving.\n"; } } $car = new Car(); $car->startEngine(); $car->drive();
Car
类继承 Vehicle
,继承其方法。我们创建一个 Car 实例并调用继承的和新的方法。这展示了子类如何获得父类的功能。
重写方法
此示例展示了子类如何重写父类方法。
<?php declare(strict_types=1); class Animal { public function makeSound(): void { echo "Some generic animal sound.\n"; } } class Dog extends Animal { public function makeSound(): void { echo "Bark! Bark!\n"; } } $dog = new Dog(); $dog->makeSound();
Dog
类重写了 Animal
的 makeSound
方法。当在 Dog 实例上调用时,子类版本将执行。这演示了多态性。
访问父类方法
此示例展示了如何从重写的子类方法中调用父类方法。
<?php declare(strict_types=1); class Person { public function greet(): void { echo "Hello!\n"; } } class Student extends Person { public function greet(): void { parent::greet(); echo "I'm a student.\n"; } } $student = new Student(); $student->greet();
Student
类继承 Person
并重写 greet。使用 parent::greet
调用原始父类方法。这允许扩展而不是替换父类功能。
受保护的成员
此示例演示了将受保护的属性与继承一起使用。
<?php declare(strict_types=1); class BankAccount { protected float $balance = 0; public function getBalance(): float { return $this->balance; } } class SavingsAccount extends BankAccount { public function deposit(float $amount): void { $this->balance += $amount; } } $account = new SavingsAccount(); $account->deposit(100.50); echo "Balance: " . $account->getBalance();
balance
属性是受保护的,因此 SavingsAccount
可以直接访问它。受保护的成员对子类可见,但对公众不可见。这保持了封装性,同时允许继承。
构造函数继承
此示例展示了构造函数如何与继承一起工作。
<?php declare(strict_types=1); class Product { public function __construct( protected string $name, protected float $price ) {} } class Book extends Product { public function __construct( string $name, float $price, private string $author ) { parent::__construct($name, $price); } } $book = new Book("PHP Guide", 29.99, "John Doe");
Book
类继承 Product
并添加了作者属性。它调用父构造函数以设置继承的属性。子类必须处理父构造函数的要求。
最终类和方法
此示例演示了使用 final 关键字阻止继承。
<?php declare(strict_types=1); final class MathUtils { public static function square(float $num): float { return $num * $num; } } // This would cause an error: // class AdvancedMath extends MathUtils {} echo MathUtils::square(5);
final
关键字阻止 MathUtils
被扩展。最终方法不能在子类中被重写。这对于安全或实现永远不应该改变的情况很有用。
多层继承
此示例显示了三层继承层次结构。
<?php declare(strict_types=1); class Shape { public function draw(): void { echo "Drawing a shape.\n"; } } class Polygon extends Shape { public function draw(): void { echo "Drawing a polygon.\n"; } } class Triangle extends Polygon { public function draw(): void { echo "Drawing a triangle.\n"; } } $triangle = new Triangle(); $triangle->draw();
Triangle
继承 Polygon
,Polygon
继承 Shape
。每一层都可以重写其父类的方法。对 draw() 的调用将执行层次结构中最具体的版本。
最佳实践
- 倾向于组合: 仅对真正的 "is-a" 关系使用继承。
- 限制深度: 避免深度继承层次结构(超过 2-3 层)。
- Liskov 原则: 子类应该可以替代父类。
- 文档: 清楚地记录继承关系。
- 抽象类: 考虑使用抽象类进行部分实现。
来源
本教程使用 extends 关键字介绍了 PHP 继承,并提供了展示各种继承场景和最佳实践的实际示例。
作者
列出 所有 PHP 教程。