Проектирование классов для работы с БД в 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); }
В данной ситуации можно использовать паттерн 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();
Таким образом, обеспечивается инверсия управления зависимостями и большая гибкость кода. Каждый класс получает необходимую зависимость через конструктор, что делает код более чистым и понятным.
В данной ситуации можно использовать паттерн 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();
Таким образом, обеспечивается инверсия управления зависимостями и большая гибкость кода. Каждый класс получает необходимую зависимость через конструктор, что делает код более чистым и понятным.