Встречается на 46% собеседований по PHP

Что такое абстрактный класс

Абстрактный класс в PHP — это класс, который нельзя инстанцировать напрямую, но который может содержать абстрактные методы без реализации, обязательные для переопределения в дочерних классах. Он служит шаблоном для других классов, определяя общий интерфейс и частичную реализацию.

Как это работает

В PHP абстрактный класс объявляется с помощью ключевого слова abstract перед class. Такой класс может содержать обычные методы с реализацией, свойства, константы, а также абстрактные методы. Абстрактный метод объявляется с ключевым словом abstract и не имеет тела — только сигнатуру (имя и параметры). Любой класс, содержащий хотя бы один абстрактный метод, обязан быть объявлен как абстрактный.

Дочерний класс, наследующий абстрактный класс, должен реализовать все абстрактные методы, иначе он сам должен быть объявлен абстрактным. Это гарантирует, что все конкретные наследники имеют единый интерфейс, но могут реализовывать его по-разному.

Пример

php
<?php

abstract class Animal {
    protected $name;

    public function __construct($name) {
        $this->name = $name;
    }

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

    // Обычный метод с реализацией
    public function getName() {
        return $this->name;
    }
}

class Dog extends Animal {
    public function makeSound() {
        return "Гав-гав";
    }
}

class Cat extends Animal {
    public function makeSound() {
        return "Мяу";
    }
}

$dog = new Dog("Бобик");
echo $dog->getName() . ": " . $dog->makeSound(); // Бобик: Гав-гав

// $animal = new Animal("Зверь"); // Ошибка: нельзя создать экземпляр абстрактного класса

Подводные камни

  • Нельзя создать объект абстрактного класса — попытка вызовет фатальную ошибку.
  • Абстрактные методы не могут иметь тело, даже пустое.
  • Если дочерний класс не реализует все абстрактные методы, он также должен быть объявлен абстрактным.
  • Абстрактные методы могут иметь параметры, но их сигнатуры должны быть совместимы при переопределении (правила совместимости типов).
  • В PHP 8.0+ можно использовать абстрактные методы с типизированными параметрами и возвращаемыми типами, что усиливает контракт.

Когда использовать

Абстрактные классы применяются, когда нужно определить общую функциональность для группы связанных классов, но при этом оставить часть методов на усмотрение наследников. Это удобно для:

  • Создания базовых классов в иерархии (например, Animal для Dog и Cat).
  • Реализации шаблонного метода (Template Method), когда общий алгоритм задан в абстрактном классе, а шаги делегируются абстрактным методам.
  • Обеспечения контракта для наследников без необходимости дублировать код.

Отличие от интерфейсов: интерфейс задаёт только сигнатуры методов, без реализации и свойств, а абстрактный класс может содержать реализацию и состояние. Выбор между ними зависит от того, нужна ли общая логика и свойства.

Коротко

  • Абстрактный класс — это класс, который нельзя инстанцировать, но можно наследовать.
  • Абстрактные методы объявляются без тела и обязательны для реализации в конкретных наследниках.
  • Абстрактный класс может содержать обычные методы, свойства и константы.
  • Используется для задания общего шаблона и частичной реализации в иерархии классов.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы