Интерфейс в PHP – это абстрактный тип, который определяет набор публичных методов и их сигнатур, обязательных к реализации классом, подключающим его через implements, без предоставления собственной реализации этих методов.
Пример
interface Hookable
{
public static function registerHooks(): void;
}
Это контракт: любой класс, который написал implements Hookable, гарантирует что у него есть метод registerHooks(). Кода внутри нет — только обещание.
Должны реализовать этот метод в классе:
abstract class Block implements Hookable {
public static function registerHooks(): void
{
add_action('acf/init', [static::class, 'registerBlock']);
}
}
}
В нашем плагине очень важно чтобы некоторый классы имели метод registerHooks.
// Plugin.php
public static function loadHookableClasses(array $classes): void
{
array_walk($classes, fn($item) => $item::registerHooks());
}
И вызываем:
// в главном файле плагина метод init
self::loadHookableClasses([
InLinksShortcode::class,
GradeTableBlock::class,
PostsWidget::class,
HowToModule::class,
PartnerLink::class,
]);
Эта функция не знает и не хочет знать — блок это, шорткод или виджет. Она знает одно: у каждого есть registerHooks(), потому что все они implements Hookable.
Получается мы передаем наши классы, и для всех них вызываем registerHooks.
Важные нюансы
- Интерфейс не может иметь обычные свойства.
- Интерфейс не может иметь реализацию методов.
- В интерфейсе нельзя объявить
protectedилиprivateметоды. Это будет ошибка. Можно только public. - Можно реализовать несколько интерфейсов:
class Service implements Logger, Cacheable, JsonSerializable