Я кодирую как хобби, поэтому у меня нет формального образования по этой теме, поэтому, пожалуйста, извините меня за этот вопрос. Я действительно много исследовал эту тему, но не смог получить четкий ответ.
какую структуру классов я должен выбрать для базы данных в php?
класс DatabaseObject и один дочерний класс для каждой таблицы, а также класс DatabaseObjectArray, который расширяет ArrayObject и позволяет сразу загружать сразу несколько объектов DatabaseObject. (я должен иметь возможность перебирать его с помощью foreach или аналогичного) DatabaseObject имеет функции load() и store().
класс Database и интерфейс DatabaseObject, где каждая таблица сопоставляется с одним классом, который реализует inteface. База данных может использоваться для загрузки одного объекта за раз или нескольких из массива.
где должен быть выполнен sql?
если я выберу вариант один, у меня будет некоторый дублирующий код между DatabaseObject и DatabaseObjectArray, так лучше ли использовать расширенный класс PDO?
Например, я хочу иметь массив с именем $ condition, а также функцию addCondition ($ key, $ value, $ operator = '='), чтобы я мог сначала определить условия, а затем загрузить() данные в объект. (sql-запрос собран на основе $ условий) Должен ли я определять их в DatabaseObject и DatabaseObjectArray независимо или в расширении PDO?
Расширение PDO
никогда не является "лучшей практикой". На самом деле это полная противоположность. И черты - всего лишь кодовый запах, поскольку они предназначены для копирования-вставки с помощью интерпретатора.
ИМХО, лучший подход - отделить логику бизнеса и логику персистентности. Например: у вас есть класс, который выполняет пользовательскую логику и отдельный класс, который сохраняет или заполняет экземпляр этого пользовательского класса. Этот шаблон называется преобразователем данных.
В основном настройка выполняется следующим образом:
$user = new Entity\User($id);
$mapper = new Mapper\User($pdo);
$mapper->fetch($user);
if ($user->isBanned() && $user->hasExpiredBan(new DateTimeImmutable)) {
$user->removeBan();
$mapper->store($user);
}
В этом случае mapper не расширяет PDO, а вместо этого использует его как зависимость. Что касается того, как делиться одним и тем же экземпляром PDO с несколькими картографами, вы можете посмотреть этот старый пост.
И для простого примера того, как сам транслятор можно реализовать, вы можете посмотреть на этот пример.