У меня в проекте на ларавеле реализовано внедрение зависимостей для репозиториев. Репозиторий наследует некий интерфейс и по имени этого интерфейса классы получают данные из репозитория. В процессе разработки вместо самих репозиториев внедряю промежуточный кэширующий слой, который реализует тот же интерфейс, но отдает кэш вместо того, чтобы обращаться в бд (код не дам, проект под NDA).
Другой пример - mock объекты при тестировании. Также можете посмотреть фреймворки, там полиморфизм активно используется например для того, чтобы вы могли использовать различные движки бд, сохранять файлы на удаленный сервер по фтп, а не на свой, поменяв лишь одно слово в конфиге и не меняя код в ваших классах.