Я создаю веб-приложение с различными классами для вещей, как пользователь, Smarty управления шаблонами и т.д.базы данных дизайн класса
У меня уже есть класс базы данных, которая все хорошо, но я обеспокоен о его выполнении.
В настоящее время, в другом классе, я делаю $this->db = new DB()
создать локальный экземпляр базы данных, однако __construct()
функции класса базы данных создает новое подключение к серверу MySQL каждый раз, когда я делаю новый DB()
экземпляр, который, очевидно, меньше разумный. Это означает, что каждый экземпляр всех моих разных классов, использующих класс базы данных, устанавливает соединение с сервером. У меня нет большого количества классов, но я хочу только одну загрузку на страницу.
Это урезанный пример того, что у меня есть на данный момент:
// Database class used by multiple other classes
class DB {
private $dbh;
function __construct() {
$this->dbh = // PDO connection here
}
public function query($str) {
// Do a query
}
}
// Example class User
class User {
private $db; // Stores local instance of DB class.
function __construct() {
$this->db = new DB(); // Makes a new connection in DB::__construct()
}
public function login() {
$this->db->query('SELECT * FROM users');
}
}
Я ищу «лучший» или наиболее распространенную практику это делать. Я не хочу делать 10-ие отдельные соединения для каждой загрузки страницы.
Я хочу знать, что лучший способ использования и управления классом DB в моем приложении. Мои четыре мысли таковы:
- Будет ли использование постоянного соединения с сервером MySQL решить эту проблему с несколькими соединениями для меня?
- Должен ли я использовать статический заводский класс и возвращать экземпляр БД вместо использования
new DB()
? - Является ли правильным решением использовать полностью статический класс и просто делать
DB::query()
(например) каждый раз, когда я ссылаюсь на него? - Я часто использую несколько классов в другом (поэтому у нас могут быть классы Folders, которым требуются классы User, DB и Smarty). Является ли это обычной практикой для
extend
каждого класса?
Вы находитесь на правильном пути, чтобы сохранить БД как свойство класса ... Это часто делается либо путем создания синглтона для базы данных, чей экземпляр извлекаются в каждом классе необходимости, или (возможно, лучше) путем инъекции зависимостей, посредством чего вы создаете экземпляр БД и затем передаете его в конструктор в качестве параметра. –
Здесь есть несколько хороших иллюстраций. Если я найду его, я свяжу его. –
[Здесь один] (http://stackoverflow.com/questions/2017911/properly-using-classes-in-other-classes-in-php) с хорошим принятым ответом.Есть другие с несколькими хорошими ответами. –