Как получить доступ к объекту А содержащего объект Б из объекта Б? Изучаю 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
207 +1
0
Ответы
1

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

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

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

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

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 622 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир