Дизайн ООП: как включить обработку БД в объекты приложения

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

На этапе проектирования легко решить, что вам нужен объект:

User ========== Unique ID Login name Password Full name 

И легко преобразовать его в объект базы данных:

 CREATE TABLE user ( user_id INT NOT NULL PRIMARY KEY, username VARCHAR(15) NOT NULL UNIQUE, password_hash CHAR(32) NOT NULL, full_name VARCHAR(50) ); 

Мои сомнения начинаются с уровня PHP. Очевидное преобразование:

 <?php class User{ public $user_id, $username, $full_name; } ?> 

Однако, как я должен заполнять фактические значения?

Я могу сохранить класс DB-агностик:

 <?php class User{ public $user_id, $username, $full_name; public function __construct($user_id, $username, $full_name){ $this->user_id = $user_id; $this->username = $username; $this->full_name = $full_name; } } ?> 

Но тогда мне нужно запустить запрос где-то еще …

Я могу инкапсулировать его внутри конструктора класса:

 <?php class User{ public $user_id, $username, $full_name; public function __construct($user_id){ $sql = 'SELECT username, full_name FROM user WHERE user_id=?'; $parameters = array($user_id); $res = get_row_from_db($sql, $parameters); $this->user_id = $user_id; $this->username = $res['username']; $this->full_name = $res['username']; } } ?> 

Это выглядит элегантно, но это мешает мне делать много вещей с классом:

  • Подтвердите пользователя по имени пользователя и паролю ($ user_id пока не известен)
  • Печатать информацию о пользователях с сообщений на форуме (я не могу позволить себе 100 запросов, чтобы показать 100 пользователей)

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

Я также хотел бы получить некоторые идеи о:

  • Обработка коллекции пользователей
  • Сохранение информации в сеансе, поэтому БД не нужно запрашивать при каждом запросе страницы

==== ЗА ЗАПИСИ ====

Я отметил ответ Гордона как ответ, потому что он дает интересное чтение. Независимо от того, что стоит отметить, что я нашел очень иллюстративный фрагмент кода в одном из комментариев пользователя на странице «Сериализация объектов» руководства по PHP, который можно резюмировать следующим образом:

  • Он использует один класс.
  • Экземпляр представляет конкретного пользователя.
  • Конструктор получает данные пользователя.
  • Класс предоставляет статические методы для функциональных возможностей, которые необходимы перед тем, как иметь возможность иметь экземпляр, например, выборку пользователя из БД по идентификатору или имени.
  • Пользовательские экземпляры могут быть сериализованы как данные сеанса.

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

Solutions Collecting From Web of "Дизайн ООП: как включить обработку БД в объекты приложения"

Это зависит от вашей архитектуры. Четыре общих архитектурных шаблона источника данных можно найти в шаблонах архитектуры корпоративного приложения Мартина Фаулера :

  • Шлюз данных таблицы

    Объект, который действует как шлюз к таблице базы данных. Один экземпляр обрабатывает все строки в таблице.

  • Шлюз данных строк

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

  • Активная запись

    Объект, который обертывает строку в таблице базы данных или представлении, инкапсулирует доступ к базе данных и добавляет логику домена к этим данным.

  • Карта данных

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

Дальнейшие шаблоны:

Считаете ли вы использование библиотеки реляционного сопоставления объектов, например Doctrine или Propel ?

Быстрый запуск программы Zend Framework имеет довольно простой обзор, обзор моделей и карт (google'able terms) вместе с некоторыми исходными кодами.