Перейти к основному содержимому

Интерфейс vs Абстрактный класс

Интерфейс​

Интерфейс — это элемент ООП, который группирует набор объявлений методов без их реализации. Он определяет контракт («что»), который класс обязан выполнить.

Правила​

  • Не может содержать реализацию методов.
  • Все методы должны быть публичными.
  • Не может содержать переменные/свойства (но может содержать константы).
  • Класс может реализовывать несколько интерфейсов.
interface Animal {
public function makeSound();
}

class Dog implements Animal {
public function makeSound() {
echo "Bark";
}
}

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

Абстрактный класс — это частично реализованный класс. Он может содержать как абстрактные методы (которые должны быть реализованы в дочерних классах), так и обычные методы (которые предоставляют поведение по умолчанию).

Правила​

  • Может содержать как абстрактные, так и конкретные методы.
  • Методы могут быть public, protected или private (абстрактные методы не могут быть private).
  • Может содержать свойства (переменные).
  • Класс может наследовать только один абстрактный класс.
  • Нельзя создать экземпляр абстрактного класса.
abstract class Animal {
public $name;

// Абстрактный метод: без тела
abstract public function makeSound();

// Конкретный метод: с телом
public function sleep() {
echo "Sleeping...";
}
}

Сравнительная таблица​

ХарактеристикаИнтерфейсАбстрактный класс
НаследованиеКласс может реализовывать несколько интерфейсов.Класс может наследовать только один абстрактный класс.
МетодыТолько сигнатуры методов, без тела.Может содержать как абстрактные, так и конкретные методы.
СвойстваНет свойств (только константы).Может содержать свойства.
ВидимостьВсе методы должны быть публичными.Методы могут быть public, protected.
НазначениеОпределить контракт (поведение).Предоставить базу для группы классов.