Абстрактные классы и методы
Определяйте частично реализованные базовые классы с помощью ключевого слова abstract
«Абстрактные классы и методы» — бесплатный урок PHP Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.
Введение: абстрактные классы
Абстрактный класс не может быть создан напрямую — это шаблон. Абстрактные методы объявляют сигнатуру без реализации, а дочерние классы должны предоставить их реализацию.
Ключевые понятия
Ключевые понятия:
- Объявляются с помощью
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;
}Шаблон
Распространённые шаблоны абстрактных классов помогают аккуратно решать регулярно возникающие задачи проектирования. Применяйте их последовательно, чтобы код оставался понятным и удобным для сопровождения.
Когда использовать
Знать, когда применять абстрактные классы, так же важно, как знать, как это делать. Чрезмерное использование приводит к усложнению, а недостаточное — к дублированию.
Пример из реального мира
В реальных приложениях абстрактные классы часто встречаются во фреймворках, ORM и служебных уровнях. Понимание этой возможности подготовит Вас к участию в профессиональных проектах на PHP.
Распространённые ошибки
Избегайте этих ошибок при работе с абстрактными классами:
- Абстрактные классы нельзя создавать с помощью new
- Все абстрактные методы должны быть реализованы в обычных дочерних классах
- Используйте шаблонный метод для определения каркаса алгоритма
- Абстрактные классы могут иметь конструкторы, свойства и обычные методы
Быстрая проверка
Можно ли напрямую создать экземпляр абстрактного класса с помощью 'new'?
Итоги: абстрактные классы
Итоги:
- Абстрактные классы нельзя создавать с помощью new
- Все абстрактные методы должны быть реализованы в обычных дочерних классах
- Используйте шаблонный метод для определения каркаса алгоритма
- Абстрактные классы могут иметь конструкторы, свойства и обычные методы
Часто задаваемые вопросы
Урок «Абстрактные классы и методы» бесплатный?
Да — полный текст урока «Абстрактные классы и методы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.
Чему я научусь в уроке «Абстрактные классы и методы»?
Определяйте частично реализованные базовые классы с помощью ключевого слова abstract Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать PHP Academy?
Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Абстрактные классы и методы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке PHP Academy?
Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Расширение классов с помощью наследования
- Абстрактные классы и методы
- Реализация интерфейсов
- Трейты для повторного использования кода