Как получить доступ к объекту А содержащего объект Б из объекта Б? Изучаю 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 при создании. Насколько это правильно?
Заранее спасибо.

21 Авг 2019 в 07:07
233 +1
0
Ответы
1

Для правильного проектирования класса, описывающего структуру заказа, можно разделить функциональность на более мелкие классы и использовать принципы SOLID. Например, можно создать отдельные классы для пользователя, платежа и товара, которые будут взаимодействовать друг с другом через класс заказа.

Для данной задачи можно использовать шаблон проектирования "Композиция", который позволяет создать сложные объекты из более простых объектов. Каждый объект содержит в себе другие объекты, что позволяет организовать иерархию объектов и управлять ими.

Для того чтобы получить доступ из объекта Pay к объекту User и получить ID пользователя, можно передавать ссылку на объект User в конструктор объекта Pay при его создании, чтобы иметь возможность получить доступ к его данным.

Передача ссылки на объект Lot (self) в объект Pay при создании может быть правильным решением, если вам действительно необходим доступ к данным пользователя из класса Pay. Однако, следует следить за тем, чтобы не создавать сильную связанность между объектами, чтобы избежать проблем с изменением структуры кода в будущем. Разбивайте функциональность на отдельные классы таким образом, чтобы каждый класс имел четко определенную ответственность.

20 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир