Изучаю PHP и ООП. В качестве обучения выбрал задачу - создание простенького сервиса на подобие интернет магазина.
В процедурном стиле удалось реализовать основной функционал. Решил перевести его в ОО стиль, для закрепления прочитанного из книг. Столкнулся с проблемой перехода от ассоциативных массивов к объектам.
Имеется массив содержащий заказы пользователей и сведения об их оплате следующей структуры:
[x] – заказ
[user] – информация о покупателе
[pays] - платежи
[x] – конкретная оплата и сведения о ней
[orders] - товары заказанные покупателем
[x] – товар и сведения о нём
При помощи массивов мне удалось получать все данные о заказе путём прямого обращения к конкретным полям массива. Например, для добавления информации о конкретном платеже в БД, мне так же необходима информация о покупателе - его ID.
Я решил переделать данную структуру в объекты. Заменил заказы на объект Lot содержащий объект User и массивы из объектов Pay и Orders. Таким образом:
foreach ($purchase as $lot) {
$lots[] = new Lot($lot);
}
где, Lot:
class Lot {
/**@var array Массив объектов с товарами */
private $orders = array();
/** @var array Массив объектов с платежами */
private $pays = array();
/** @var User Данные о покупателе */
private $user;
function __construct (array $lot) {
$this->user = new User ($lot['user']);
// Список платежей
if (!empty($lot['pays'])) {
foreach ($lot['pays'] as $pay) {
$payObj = new Pay($pay);
$this->pays[] = $payObj;
}
}
// Список товаров
if (!empty($lot['orders'])) {
foreach ($lot['orders'] as $order) {
$orderObj = new Order($order);
$this->orders[] = $orderObj;
}
}
}
}
Я понимаю, что скорее всего не правильно всё спроектировал. Поэтому прошу любой помощи.
1. Как правильно спроектировать класс который бы описывал структуру содержащуюся в представленном выше массиве?
2. Может быть есть какой-то шаблон проектирования для решения данной задачи?
3. Не могу понять как получить доступ из конкретного объекта Pay к объекту User, чтобы получить ID пользователя который внёс данный платёж?
4. Есть мысль передавать ссылку на объект Lot (self), в объект Pay при создании. Насколько это правильно?
Заранее спасибо.