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

Что такое интерфейсы

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

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

Интерфейс объявляется с помощью ключевого слова interface и содержит сигнатуры методов (без тела). Класс, который хочет соответствовать интерфейсу, должен использовать ключевое слово implements и реализовать все методы интерфейса. Методы в интерфейсе всегда должны быть public, и класс обязан реализовать их с той же или более широкой видимостью.

Интерфейсы могут наследовать друг от друга через extends, создавая иерархии. Класс может реализовывать несколько интерфейсов одновременно, что компенсирует отсутствие множественного наследования в PHP.

Пример

php
interface Говорящий {
    public function говорить();
}

class Человек implements Говорящий {
    public function говорить() {
        echo "Привет!";
    }
}

class Компьютер implements Говорящий {
    public function говорить() {
        echo "Здравствуй, пользователь!";
    }
}

$человек = new Человек();
$человек->говорить(); // Выводит: Привет!

$компьютер = new Компьютер();
$компьютер->говорить(); // Выводит: Здравствуй, пользователь!

В этом примере интерфейс Говорящий определяет метод говорить, а классы Человек и Компьютер реализуют его по-своему. Благодаря этому можно обрабатывать объекты обоих классов единообразно, например, в функции, которая принимает Говорящий.

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

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

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

Интерфейсы полезны, когда нужно гарантировать, что разные классы предоставляют одинаковый набор методов, но реализация может отличаться. Это особенно важно при работе с коллекциями объектов, внедрении зависимостей и построении архитектуры, ориентированной на абстракции. Например, интерфейс Logger может иметь реализации FileLogger и DatabaseLogger, и код, который логирует, будет зависеть только от интерфейса, а не от конкретного логгера.

Коротко

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