Проектирование классов для работы с БД в 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);
}

21 Авг 2019 в 07:09
194 +1
0
Ответы
1

В данной ситуации можно использовать паттерн Dependency Injection для управления зависимостями классов. Вместо того, чтобы создавать экземпляр класса db в каждом классе, можно передавать его в конструктор при создании экземпляра класса. Таким образом, можно избежать наследования от класса db и делать код более гибким и удобочитаемым.

Пример использования Dependency Injection:

class db {
// Класс для работы с БД
}
class db_ext {
// Класс с различными функциями
}
class db_module_N {
private $db;
public function __construct(db $db) {
$this->db = $db;
}
// Дополнительные методы для работы с модулем
}
// Использование классов
$db = new db();
$db_module_N1 = new db_module_N($db);
$db_module_N2 = new db_module_N($db);
$db_ext = new db_ext();

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

20 Апр 2024 в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир