Это проблема дизайна, с которой я сталкиваюсь регулярно, и я хотел бы найти общее представление о предмете. Приведенный здесь код является лишь примером.
На этапе проектирования легко решить, что вам нужен объект:
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']; } } ?>
Это выглядит элегантно, но это мешает мне делать много вещей с классом:
Скорее всего, мне нужно определить несколько классов, но я не уверен, как его организовать. Один базовый класс и многие дочерние классы? Независимые классы? Один класс со специальными методами? Возможно, это хорошо известный шаблон дизайна, но меня изучили процедурные программы.
Я также хотел бы получить некоторые идеи о:
==== ЗА ЗАПИСИ ====
Я отметил ответ Гордона как ответ, потому что он дает интересное чтение. Независимо от того, что стоит отметить, что я нашел очень иллюстративный фрагмент кода в одном из комментариев пользователя на странице «Сериализация объектов» руководства по PHP, который можно резюмировать следующим образом:
Не будучи гуру ООП, я нашел его очень простым, но чистым и полезным. Тексты ООП имеют тенденцию к чрезмерному усложнению простых задач, и моя ежедневная работа заключается в основном в небольших проектах.
Это зависит от вашей архитектуры. Четыре общих архитектурных шаблона источника данных можно найти в шаблонах архитектуры корпоративного приложения Мартина Фаулера :
Шлюз данных таблицы
Объект, который действует как шлюз к таблице базы данных. Один экземпляр обрабатывает все строки в таблице.
Шлюз данных строк
Объект, который действует как шлюз для одной записи в источнике данных. В строке есть один экземпляр.
Активная запись
Объект, который обертывает строку в таблице базы данных или представлении, инкапсулирует доступ к базе данных и добавляет логику домена к этим данным.
Карта данных
Слой Mappers, который перемещает данные между объектами и базой данных, сохраняя их независимо друг от друга и самого транслятора.
Дальнейшие шаблоны:
Считаете ли вы использование библиотеки реляционного сопоставления объектов, например Doctrine или Propel ?
Быстрый запуск программы Zend Framework имеет довольно простой обзор, обзор моделей и карт (google'able terms) вместе с некоторыми исходными кодами.