Сложно понять о чём вы пытаетесь спросить, но попробую пояснить.
Интерфейс должен всегда храниться в слое или модуле, где он используется. Интерфейс так же создаёт абстракцию и создан для уменьшения связанности.
Например, вам нужно оправлять уведомления из модуля магазина в модуль уведомлений. В магазине вы делаете интерфейс (API) через который магазин будет отправлять уведомления. Саму реализацию можно оставить и в магазине, но лучше вынести в src/Infrastructure
. В этой папке можно хранить все инфраструктурные вещи.
Так же можно использовать пример из DDD где есть деление на слои Application, Domain, UI, Infrastructure. В этом случае в Domain может быть RepositoryInterface
, а в Infrastructure реализация DoctrineRepository
Что касается абстрактных классов, то храните их там, где вы их используете или реализуете. Это может быть где угодно. Абстрактный класс, в первую очередь, класс! Он создан для общей базовой логики в классах, но при этом его нельзя вызвать через new()