0Pricing
PHP Academy · 课时

抽象类与抽象方法

使用 abstract 关键字定义部分实现的基类。

抽象类与抽象方法 是 CoddyKit 上的免费 PHP Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 PHP Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 PHP Academy 课程共包含 4 节课。

简介:PHP 抽象类

抽象类不能直接实例化,它是一种模板。抽象方法只声明签名而不提供实现;子类必须提供这些实现。

核心概念

核心概念:

  • 使用 abstract class 声明
  • 抽象方法没有方法体:abstract public function x();
  • 子类必须实现所有抽象方法
  • 可以同时包含抽象方法和具体方法

抽象类定义

示例:

<?php
abstract class Animal {
    public function __construct(protected string $name) {}

    // Must be implemented by each subclass
    abstract public function sound(): string;

    // Shared concrete method
    public function introduce(): string {
        return "I am {$this->name} and I say: " . $this->sound();
    }
}

实现抽象方法

继续:

<?php
class Dog extends Animal {
    public function sound(): string { return 'Woof'; }
}

class Cat extends Animal {
    public function sound(): string { return 'Meow'; }
}

$animals = [new Dog('Rex'), new Cat('Whiskers')];
foreach ($animals as $a) {
    echo $a->introduce() . PHP_EOL;
}
// I am Rex and I say: Woof
// I am Whiskers and I say: Meow

模板方法模式

深入理解:

<?php
abstract class DataProcessor {
    // Template method: defines the algorithm skeleton
    final public function process(array $data): array {
        $data = $this->validate($data);
        $data = $this->transform($data);
        return $this->format($data);
    }

    abstract protected function validate(array $data): array;
    abstract protected function transform(array $data): array;

    protected function format(array $data): array { return $data; }
}

抽象类与接口

实际应用:

<?php
// Use abstract class when:
// - Subclasses share implementation code
// - You need constructor logic or state

// Use interface when:
// - Defining a contract (no implementation needed)
// - Multiple inheritance of type is needed

// A class can only extend ONE abstract class
// but can implement MULTIPLE interfaces

部分实现

高级内容:

<?php
abstract class Repository {
    // Concrete method available to all subclasses
    protected function findById(int $id, string $table): array {
        $stmt = $this->getDb()->prepare("SELECT * FROM $table WHERE id = ?");
        $stmt->execute([$id]);
        return $stmt->fetch(PDO::FETCH_ASSOC) ?: [];
    }

    abstract protected function getDb(): PDO;
    abstract public function find(int $id): array;
}

模式

常见的抽象类模式用于简洁地解决反复出现的设计问题。请始终一致地应用这些模式,以编写易读且易维护的代码。

适用时机

了解何时应用抽象类,与了解如何应用同样重要。过度使用会导致复杂性,不充分使用则会导致重复。

实际应用示例

在实际应用中,抽象类经常出现在框架、对象关系映射器和服务层中。理解抽象类有助于您参与专业的 PHP 项目。

常见问题

请避免在使用抽象类时犯以下错误:

  • 抽象类不能使用 new 实例化
  • 必须在具体子类中实现所有抽象方法
  • 使用模板方法模式定义算法骨架
  • 抽象类可以包含构造方法、属性和具体方法

快速检查

可以直接使用“new”实例化抽象类吗?

回顾:抽象类

总结:

  • 抽象类不能使用 new 实例化
  • 必须在具体子类中实现所有抽象方法
  • 使用模板方法模式定义算法骨架
  • 抽象类可以包含构造方法、属性和具体方法

常见问题解答

「抽象类与抽象方法」课时是免费的吗?

是的 — 「抽象类与抽象方法」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 PHP Academy 课程的其余内容,请升级到 CoddyKit PRO。 PHP Academy 课程共包含 4 节课。

「抽象类与抽象方法」这节课中我会学到什么?

使用 abstract 关键字定义部分实现的基类。 你通过在浏览器中直接运行的动手代码来练习 PHP Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 PHP Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 PHP Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「抽象类与抽象方法」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 PHP Academy 课中编写并运行代码吗?

能。每节 PHP Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用继承扩展类
  2. 抽象类与抽象方法
  3. 实现接口
  4. 使用 Trait 复用代码
← 返回 PHP Academy