Какие минусы наследования
Что проверяют
Понимаете ли вы, почему «предпочитайте композицию наследованию» стало общим правилом, и можете ли показать это на PHP-коде, а не пересказать лозунг. Следом обычно просят пример, где наследование всё-таки уместно, или спрашивают про final.
Как отвечать
Главные минусы:
- хрупкий базовый класс: наследник зависит от внутреннего поведения родителя, а не только от публичного API. Родитель поменял порядок вызовов в методе, и переопределённый метод в наследнике ломается, хотя его никто не трогал;
- нарушение инкапсуляции:
protected-свойства фактически публичны для всех наследников, и изменить их без поиска по всему коду нельзя; - нарушение LSP: классика с
Square extends Rectangle, где наследник меняет контракт и ломает код, работающий с базовым типом. PHP проверяет совместимость сигнатур, но не смысл; - одиночное наследование: в PHP только один родитель. Желание переиспользовать код из двух мест приводит к трейтам, а их конфликты решаются через
insteadofиas, что тоже не прибавляет ясности; - глубокие иерархии:
BaseControllerс десятком вспомогательных методов, от которого наследуется всё подряд. Чтобы понять поведение класса, приходится читать всю цепочку вверх; - тестирование: подменить родителя в тесте нельзя, вместе с классом тянется вся цепочка с её зависимостями.
Альтернатива: интерфейс плюс композиция, зависимости через конструктор и DI-контейнер Symfony или Laravel. Наследование уместно, когда отношение «является» устойчиво и базовый класс спроектирован для расширения, например шаблонный метод или абстрактный класс фреймворка.
Полезно упомянуть инструменты: классы final по умолчанию и атрибут #[\Override] с PHP 8.3, который даёт ошибку, если родительский метод переименовали и переопределение повисло в воздухе.
Где спотыкаются
Рассказывают про ромбовидное наследование как про проблему PHP. Множественного наследования классов в PHP нет, актуальны конфликты трейтов.
Называют минусом «проблемы с многопоточностью». К наследованию это отношения не имеет.
Отвечают «наследование плохое» без оговорок. Сильнее назвать условия, когда оно оправдано, и показать, как перейти от него к композиции.