PHP 通过三种相关机制来支持 OOP 继承和抽象:类继承(extends)、抽象类(部分基类)和接口(契约)。每种都有不同的设计目的。
Inheritance — 扩展父类
php
{
{}
{ ; }
}
{
{ ; }
{
::() . ;
}
}
子类 extends 父类,继承其成员并可选地重写。parent:: 调用被重写的父方法。PHP 支持单继承(仅一个父类)。
abstract class Shape {
abstract public function area(): float; // abstract — subclasses MUST implement
public function describe(): string { // concrete — shared implementation
return "Area: " . $this->area();
}
}
class Circle extends Shape {
public function __construct(private float $r) {}
public function area(): float { return 3.14159 * $this->r ** 2; } // must implement
}
// new Shape(); // ❌ error — abstract classes can't be instantiated
抽象类将抽象方法(子类必须实现)与具体共享代码混合在一起——一个无法直接实例化的基类。
interface Drawable {
public function draw(): void; // only signatures — no implementation
}
interface Serializable {
public function serialize(): string;
}
class Widget implements Drawable, Serializable { // implement MULTIPLE interfaces
public function draw(): void { /* ... */ }
public function serialize(): string { return "..."; }
}
接口定义契约(方法签名,无实现)。一个类可以 implement 多个接口——PHP 在单继承限制下实现多契约的方式。
extends (inheritance) → "is-a" relationship, reuse + override behavior
abstract class → a base with SHARED code + methods subclasses must implement (single)
interface → a CONTRACT/capability multiple unrelated classes can fulfill (multiple)
→ "Program to an interface" — depend on interfaces for flexible, testable designs.
继承、抽象类和接口是核心 OOP 工具,理解它们的区别对设计结构良好的 PHP 应用程序很重要(也对使用框架很重要,框架大量依赖这些机制)。继承(extends)通过"is-a"关系提供代码重用,但 PHP 仅允许单继承。抽象类提供包含已实现代码和子类必须定义的方法的共享基类——适合共享逻辑的紧密相关类。接口定义契约/能力,关键是一个类可以实现多个接口——这是灵活、解耦设计的关键,也是 PHP 对单继承限制的解决方案。
了解何时使用每种(继承用于 is-a 重用、抽象类用于共享部分实现、接口用于契约/能力),以及面向接口编程(依赖抽象以实现可测试、灵活、框架友好的代码)的原则,是面向对象 PHP 设计的重要知识。
这些机制支撑了 Laravel 和 Symfony 等框架如何组织其代码(到处都是接口和抽象基类),使它们对于设计自己的代码和理解构建的框架都至关重要。