Базы данных MySQL подключение в конструкторе


Я абсолютный новичок в PHP ООП в поисках "Святого Грааля" подключения к базе данных MySQL раз и повторно использовать это подключение для всего сайта.

classes/db.php

<?php
define('SERVER', 'localhost');
define('USERNAME', 'root');
define('PASSWORD', 'password');
define('DATABASE', 'cms');

class DB {
    function __construct(){
        $connection = @mysql_connect(SERVER, USERNAME, PASSWORD) or die('Connection error -> ' . mysql_error());
        mysql_select_db(DATABASE, $connection) or die('Database error -> ' . mysql_error());
    }
}
?>

classes/users.php

<?php
class Users {
    function __construct(){
        $db = new DB();
    }

    public function read(){
        $query = mysql_query("select use_id, use_name, use_email FROM users");
        while ($row = mysql_fetch_array($query)){
            $data[] = $row;
        }
        return $data;
    }
}
?>

users.php

<?php require_once('classes/db.php'); ?>
<?php require_once('classes/users.php'); ?>
<?php
$Users = new Users();
$users = $Users->read();
?>
<?php
if ($users) {
    echo '<ul>';
    foreach($users as $user){
        echo '<li><a href="mailto:' . $user['use_email'] . '">' . $user['use_name'] . '</a></li>';
    }
    echo '</ul>';   
}
?>

Мои сомнения в основном на пользователей класса входит:

function __construct(){
    $db = new DB();
}

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

Я читал подобный вопрос здесь, но я не могу понять абстракция/проведение ссылкой/синглтон предложение принято отвечать, и отсутствие полного практический пример не помогает мне.



Комментарии
2 ответа

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

class Users {
private $db;

public function __construct($db) {
$this->db = $db;
}

....
}

class Products {
private $db;

public function __construct($db) {
$this->db = $db;
}

....
}

$db = new DB();
$users = new Users($db);
$products = new Products($db);

3
ответ дан 1 ноября 2011 в 05:11 Источник Поделиться

Дело в том, что это было бы идеальным не сделать подключение к БД каждый раз
вы хотите что-то запроса, вместо этого вы сделать подключение только через
Singleton-класс "связи", и, делая это, у вас только одно соединение,
потому что существует только один instnace соединения класса

Но иметь только одно подключение-это не хорошо, потому что используют один канал
несколько пользователей могут притормозить. На мой взгляд неплохо бы иметь ряд
доступных подключений и использовать только те, не делая новое соединение каждый раз
вы хотите что-то запрос, я предполагаю, что это называется "пул соединений".
Может быть, вы можете реализовать синглтон класса с массивом фиксированного числа связей
имеющейся базы данных, скажем, 20 так сказать.

Но это зависит от конфигурации сервера, на котором выполняется скрипт php
это может быть многопоточным или многопроцессным.
Здесь он объяснил: Апач: многопоточная против мульти-процесс (пре-раздвоенный)
Если ваш сервер настроен как многопроцессово-это же для подключения в
конструктор класса или в другой класс.

если ваш сервер настроен как многопоточный лучше иметь одноэлементный класс.
Но я также читал, что PHP не многопоточный безопасный.

1
ответ дан 1 ноября 2011 в 05:11 Источник Поделиться

Другие вопросы по теме
в MVC улучшения - 0 - to_do
1 ноября 2011 в 03:11
Синглтон фантик
1 ноября 2011 в 03:11
ПДО (MySQL), то подключение и класс запроса, безопасности и логики
31 октября 2011 в 06:10
Это правильный шаблон фабричный метод?
2 ноября 2011 в 07:11