PHP: Погружаясь в классы
2026-02-26 22:55 Diff

Наследование классов – механизм, позволяющий создавать классы (говорят подклассы) на основе других классов (называемых базовыми или суперклассами). Подклассы в таком случае "наследуют" структуру базовых классов, то есть получают возможность использовать всё, что определено в базовом классе.

Механизм наследования – сложная система, со множеством элементов, дополнительных сущностей и особенностей поведения. Поэтому изучаться он будет в несколько приёмов, на протяжении всего курса.

Рассмотрим наследование на примере структуры HTML. Каждый тег в HTML по своему уникален. С другой стороны, все они имеют общие атрибуты и некоторые другие характеристики. Попробуем отобразить это с помощью иерархии классов.

Конкретные элементы, представленные тегами в HTML, наследуются от этого класса:

Наследование записывается так: A extends B. Эта запись означает, что класс A наследует класс B. Теперь посмотрим, как работает наследование:

Внутри HTMLAnchorElement нет определения конструктора, но благодаря наследованию, этот класс имеет доступ ко всем публичным методам и свойствам суперкласса. PHP вызывает их автоматически при обращении к ним. В свою очередь, внутри __toString() вызываются методы, которых нет в текущих классах, поэтому они также берутся из родительского класса.

Цепочка наследования

В отличие от интерфейсов, наследование классов в PHP – одиночное. Другими словами, наследоваться можно только от одного класса. Точно так же как и в Java. Множественное наследование в этих языках было убрано специально, из-за его высокой сложности и проблем, которые оно добавляет (например, коллизии методов и свойств). С другой стороны, сама по себе цепочка наследования может быть сколь угодно глубокой:

Оператор проверки типа

Оператор instanceof учитывает классы из цепочки наследования:

Если нужно проверить точный класс, то это можно сделать по-другому:

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