Это проблема дизайна, с которой я регулярно сталкиваюсь, и я хотел бы найти некоторые общие идеи по этому вопросу.Приведенный здесь код является лишь примером.
На этапе проектирования легко решить, что вам нужен объект:
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-agnostic:
<?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 пользователей))
Скорее всего, мне нужно определить несколько классов, но я не уверен, как это организовать.Один базовый класс и много дочерних классов?Самостоятельные занятия?Один класс с конкретными методами?Возможно, это хорошо известный шаблон проектирования, но меня учили процедурному программированию.
Буду также признателен за некоторые идеи о:
- Обработка набора пользователей
- Хранение информации в сеансе, поэтому к БД не нужно запрашивать каждый запрос страницы
==== ДЛЯ ЗАПИСЕЙ ====
IЯ пометил ответ Гордона как ответ, потому что он интересен.Как бы то ни было, стоит отметить, что я обнаружил очень иллюстративный фрагмент кода в одном из комментариев пользователя на странице Сериализация объектов в руководстве по PHP, который можно обобщить следующим образом:
- Используется один класс.
- Экземпляр представляет определенного пользователя.
- Конструктор снабжается сведениями о пользователе.
- Класс предоставляет статические методы для требуемой функциональности.прежде чем иметь возможность иметь экземпляр, например, выборку пользователя из БД по ИД или имени.
- Пользовательские экземпляры могут быть сериализованы как данные сеанса.
Не будучи гуру ООП, яЯ нашел это очень простым, но чистым и полезным.ООП тексты имеют тенденцию усложнять простые задачи, и моя ежедневная работа состоит в основном из небольших проектов.