Задать вопрос

Проектирование классов для работы с БД в PHP

Перерабатываю существующий проект, в нём достаточно много классов для работы с БД, однако же спроектированы они, как мне кажется, просто ужасно.
class db — класс для работы с БД (подключение, обработка запросов/результатов, мониторинг соединения с БД)
class db_ext extends db — класс содержащий множество разных функций, которые не вошли в другие классы.
class db_module_N extends db_ext — классы модели, содержащие различные функции сопоставленные различным модулям системы

Я думаю, что наследоваться от класса (db), который предназначен для работы с БД — плохая практика. Соответственно, если мы перестаём от него наследоваться, то нужно отдельно создавать экземпляр данного класса и передавать его параметром во все классы, которые планируют работать с БД.
Пример:
$db_link = new db();
$db_module_N = new db_module_N($db_link);
$db_ext = new db_ext($db_link);


Такой код мне кажется слишком громоздким и не очень удобным. Возможно можно от этого как-то избавиться?
Делать класс db синглтоном не хочу, потому что иногда бывает нужно создавать несколько подключений к БД.

Так же некоторые классы наследуются иерархически и приходится постоянно писать
class db_module_N1 extends db_module_N
       function __construct($db)
	{
		parent::__construct($db);
	}
  • Вопрос задан
  • 5476 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
tvolf
@tvolf
Ну, тут есть только 2 варианта: либо наследование, либо композиция (в том или ином виде). Для того, чтобы не писать руками постоянно создание встраиваемого объекта и передачу его в конструктор, можно посмотреть в сторону внедрения зависимостей (dependency injection). Существуют, как я понимаю, уже готовые библиотеки этого дела, среди которых нужно поискать что-нибудь попроще. В общем, тут нужно гуглить.
По поводу же того, что в конструкторе потомка нужно постоянно вызывать конструктор родителя — не очень понятно. Если конструктор потомка больше вообще ничего не делает, то, может есть смысл его вообще не определять, и в этом случае конструктор родителя будет вызываться автоматически?
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Модель никак не должна быть связана с логикой работы с базой. Как вариант — Модели — отдельные классы которые привязаны к репозиториям — по сути менеджерам записей. Каждый репозиторий зависит от класса db, который передается ему в конструктор.
Как уже говорилось выше, что бы упростить себе жизнь для управления зависимостями можно воспользоваться реализацией DI. Например Pimple или, если чуть сложнее, PHP-DI или какой-либо другой.

А вообще почему бы не заменить все это добро на уже готовую ORM?
Ответ написан
alekciy
@alekciy
Вёбных дел мастер
Делать класс db синглтоном не хочу, потому что иногда бывает нужно создавать несколько подключений к БД.


Синглтон не исключает возможности использование нескольких подключений.
Ответ написан
@p1dl0
установка соединений с несколькими базами не так проста как кажется на первый взгляд.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы