В чем разница между интерфейсом и абстрактным классом · PHP Backend — JobPilot

В чем разница между интерфейсом и абстрактным классом

PHP Backend · 45%
Вопрос 4 / #
Пример ответа

1) Короткий ответ
Интерфейс объявляет контракт (что класс должен делать), а абстрактный класс может частично реализовывать функциональность и часто выражает отношение «is-a».

4) Сравнение

Критерий

Интерфейс (с PHP 8.0+)

Абстрактный класс

Реализация

Только сигнатуры методов (до PHP 8.0). Теперь можно добавлять default-методы (с PHP 8.1) и const/abstract const.

Может содержать реализованные и абстрактные методы, свойства.

Наследование

Класс может реализовать несколько интерфейсов.

Класс может наследовать только от одного абстрактного класса.

Состояние

Не может содержать свойства (кроме констант).

Может содержать свойства-члены с модификаторами доступа.

Тип отношения

«Реализует способность» (например, Logger).

«Является разновидностью» (например, AbstractController).

Рекомендация: Используйте интерфейсы для определения контрактов, которые могут быть реализованы разными несвязанными классами. Абстрактные классы подходят для шаблонного метода (template method), когда у классов есть общая базовая логика.

5) Пример кода

php

Copy

Download

// Интерфейс - контракт для возможности логирования
interface Logger {
    public function log(string $message): void;
}

// Абстрактный класс - базовая реализация для контроллеров
abstract class BaseController {
    protected string $name;
    
    public function __construct(string $name) {
        $this->name = $name;
    }
    
    abstract public function handle(): Response; // Должен быть реализован
    
    protected function logAction(): void {
        // Общая логика для всех контроллеров
        echo "Action in {$this->name}";
    }
}

6) Follow-up вопросы

  • Когда выбрать трейт вместо интерфейса?Повторное использование кода.

  • Можно ли объявить приватный метод в интерфейсе?Нет, только public.

7) Практический совет

  1. Создайте интерфейс Cacheable с методами get()/set() и реализуйте его в 2 классах: RedisCache и FileCache.

  2. Сделайте абстрактный класс AbstractRepository с общим методом find() и унаследуйте от него UserRepository, переопределив абстрактный getTableName().

PHP Backend
Junior
45%
Навигация
Расскажи про свой опыт
Следующий: Чем занимаешься в свободное время
Предыдущий: Расскажи про свой опыт

Мы используем cookie для улучшения сайта. Продолжая пользоваться сайтом, вы соглашаетесь с политикой cookie и политикой конфиденциальности.