Абстрактный класс — нельзя создать объект напрямую:
abstract class Block {
// Готовый код — одинаков для всех
public static function registerHooks(): void { ... }
// Дырка — каждый наследник заполняет сам
abstract public static function renderBlock(...): void;
}
new Block() → ошибка ❌ (abstract)
new CardsBlock() → работает ✓ (конкретный класс)
Суть
abstract — это контракт. Block — это не конкретный блок, это чертёж для всех блоков. PHP не скомпилирует наследника, если он не реализовал все abstract-методы.
А вот абстрактный метод. Тела нет — только сигнатура. Это дырка, которую каждый наследник обязан заполнить.
abstract public static function renderBlock(
array $block,
string $content,
bool $is_preview,
int|string $post_id
): void;
Если в наследнике не реализуем этот метод, то получим ошибку.

CardsBlock не пишет registerHooks, registerBlock, enqueueScripts, addStyleToQueue — он их наследует из Block. Пишет только:
- Два свойства:
$blockTitle,$blockName - Один метод:
renderBlock()— то что было abstract
Что было бы БЕЗ abstract class
// CardsBlock.php — 80+ строк вместо 28
class CardsBlock {
public static function registerHooks(): void {
// ← копипаста 15 строк из Block.php
}
public static function registerBlock(): void {
// ← копипаста 10 строк
}
public static function enqueueScripts(): void {
// ← копипаста 18 строк
}
public static function renderBlock(...): void {
// ← уникальный код
}
}
// ProsConsBlock.php — 110+ строк вместо 58
class ProsConsBlock {
public static function registerHooks(): void {
// ← та же самая копипаста
}
public static function registerBlock(): void {
// ← та же самая копипаста
}
// ... и так 15 раз
}