Предпочтительнее композиция (включать объекты и делегировать), чем наследование для повторного использования поведения. Наследование создает жесткую связь и может приводить к взрывному росту иерархии.
// Наследование: хрупко
class LoggingRepository extends UserRepository { ... }
// Композиция: гибко
class LoggingUserRepository implements UserRepositoryInterface {
public function __construct(private UserRepositoryInterface $inner, private Logger $logger) {}
}Наследование уместно для истинной иерархии типов (is-a), не для переиспользования кода.