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

Проектирование классов для работы с БД в 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);
	}
  • Вопрос задан
  • 5477 просмотров
Подписаться 4 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
tvolf
@tvolf
Ну, тут есть только 2 варианта: либо наследование, либо композиция (в том или ином виде). Для того, чтобы не писать руками постоянно создание встраиваемого объекта и передачу его в конструктор, можно посмотреть в сторону внедрения зависимостей (dependency injection). Существуют, как я понимаю, уже готовые библиотеки этого дела, среди которых нужно поискать что-нибудь попроще. В общем, тут нужно гуглить.
По поводу же того, что в конструкторе потомка нужно постоянно вызывать конструктор родителя — не очень понятно. Если конструктор потомка больше вообще ничего не делает, то, может есть смысл его вообще не определять, и в этом случае конструктор родителя будет вызываться автоматически?
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Модель никак не должна быть связана с логикой работы с базой. Как вариант — Модели — отдельные классы которые привязаны к репозиториям — по сути менеджерам записей. Каждый репозиторий зависит от класса db, который передается ему в конструктор.
Как уже говорилось выше, что бы упростить себе жизнь для управления зависимостями можно воспользоваться реализацией DI. Например Pimple или, если чуть сложнее, PHP-DI или какой-либо другой.

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


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

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽