Я проектирую набор базовых классов для веб-приложений. Во многом выбор решений происходит интуитивно. Как мне кажется, минимально необходимый набор должен быть таким:
Реестр. Контейнер для хранения значений и объектов в среде приложения.
Автозагрузка классов. В PHP есть элегантный способ избежать многочисленных include при соблюдении определённых соглашений.
Обработчик ошибок и исключений. Ошибки и неперехваченные исключения должны обрабатываться предсказуемым образом.
Журналирование. В процесс отладки и эксплуатации потребуются протоколы работы.
Обработчики "событий". Расширяем поведение приложения без лишнего наследования.
Локализация. Интернационализация и локализация через отдельные файлы сообщений.
Перечисленные задачи видятся мне настолько обязательными и взаимосвязанными, что не имеет смысла разносить их по отдельным файлам и даже по отдельным классам. За них отвечает "главный класс приложения", который и назовём "фреймворк".
Фреймворк даёт нам платформу для разработки и модульного тестирования других классов.
Следующий набор классов тоже почти обязателен, но реализован он может быть по-разному под конкретные задачи. Поэтому его классы не входят в состав фреймворка, а предлагаются как расширения.
Например "кеш" — фактически обязательный атрибут веб-приложения. А реализовываться он может как на базе файлов, так и на одном из движков ключ-значение, например memcache.
Второй круг классов:
Кеш.
Роутер HTTP-запросов.
Интерфейс БД.
Генерация текста по шаблону.
Аутентификация пользователя
Валидация данных.
В составе фреймворка будут интерфейсы для этих классов, а в демонстрационных примерах варианты их реализации.