Правильное использование класса базы данных в PHP? - PullRequest
1 голос
/ 29 марта 2011

Я написал довольно простой класс баз данных в PHP, который поддерживает самые простые вещи, такие как подключение / отключение, запросы, выборка данных и т. Д.

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

создать новый экземпляр каждый раз, когда я хочу использовать класс?Допустим, у меня есть функция, которая перечисляет что-то в моей базе данных, я делаю что-то вроде этого:

function listStuff() {
    $db = new Database();
    $db->connect();
    $result = $db->query($someQuery);
    //do stuff with result
    $db->dicsonnect();
}

Это, кажется, создает ненужное количество объектов в памяти, так как мне поступить об этомповторно использовать объекты, но при этом иметь одновременных пользователей?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 29 марта 2011

Вы должны быть используя зависимость инъекция .Это обеспечит не только простоту чтения и тестирования вашего кода, но и возможность многократного использования ваших функций (которые, я надеюсь, в классах).

function listStuff(DatabaseClassInstance $db) 
{
    $result = $db->query($someQuery);

    //do stuff with result
}

Объект $db будет завершен при завершении сценария, если вы используете расширения MySQLi или PDO.

Подсказка типа DatabaseClassInstance не обязательна, но хорошав этом случае убедитесь, что в функцию передан правильный тип параметра.

0 голосов
/ 29 марта 2011

хорошо, вы не можете использовать один экземпляр для более чем одного пользователя. но для одного пользователя вы можете предотвратить ненужное создание экземпляра, передав экземпляр этого объекта в центральное хранилище, называемое реестром.

0 голосов
/ 29 марта 2011

Строго говоря, вы не создадите один экземпляр для нескольких пользователей.Каждый запрос, который создает объект базы данных, создает его снова.

Если вы в основном извлекаете информацию о пользователях, используя базу данных, я бы порекомендовал написать объектную модель для представления ваших пользователей.Это, как и ваш класс базы данных, может быть включено в глобальную область вместе с вызовом session_start (), чтобы позволить вам управлять пользовательскими сеансами в одном интерфейсе класса.Моделирование возможностей сайта становится намного проще, когда постоянство, управляемое базой данных, заключено в некоторый объектный интерфейс, который имеет смысл.

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

class User{
  public function __construct($user_id){
    //use your database class to find a user id and assign properties of the user data
    //Then save to the session.
    $_SESSION['user'] = $this;
  }

  public static function Login($username, $pass){
    //use your database object to find the user id associated with the passed login creds,  then construct it as a user using the above function;
  }


  public static function Logout(){
    //remove any user in the session and restart the session
  }
}

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

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

0 голосов
/ 29 марта 2011
global $db;

lorem ipsum dolor sit amet

function listStuff() {
    global $db;
    $result = $db->query($someQuery);
    //do stuff with result
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...