Как получить доступ к объекту А содержащего объект Б из объекта Б? Изучаю 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 при создании. Насколько это правильно? Заранее спасибо.
Для правильного проектирования класса, описывающего структуру заказа, можно разделить функциональность на более мелкие классы и использовать принципы SOLID. Например, можно создать отдельные классы для пользователя, платежа и товара, которые будут взаимодействовать друг с другом через класс заказа.
Для данной задачи можно использовать шаблон проектирования "Композиция", который позволяет создать сложные объекты из более простых объектов. Каждый объект содержит в себе другие объекты, что позволяет организовать иерархию объектов и управлять ими.
Для того чтобы получить доступ из объекта Pay к объекту User и получить ID пользователя, можно передавать ссылку на объект User в конструктор объекта Pay при его создании, чтобы иметь возможность получить доступ к его данным.
Передача ссылки на объект Lot (self) в объект Pay при создании может быть правильным решением, если вам действительно необходим доступ к данным пользователя из класса Pay. Однако, следует следить за тем, чтобы не создавать сильную связанность между объектами, чтобы избежать проблем с изменением структуры кода в будущем. Разбивайте функциональность на отдельные классы таким образом, чтобы каждый класс имел четко определенную ответственность.
Для правильного проектирования класса, описывающего структуру заказа, можно разделить функциональность на более мелкие классы и использовать принципы SOLID. Например, можно создать отдельные классы для пользователя, платежа и товара, которые будут взаимодействовать друг с другом через класс заказа.
Для данной задачи можно использовать шаблон проектирования "Композиция", который позволяет создать сложные объекты из более простых объектов. Каждый объект содержит в себе другие объекты, что позволяет организовать иерархию объектов и управлять ими.
Для того чтобы получить доступ из объекта Pay к объекту User и получить ID пользователя, можно передавать ссылку на объект User в конструктор объекта Pay при его создании, чтобы иметь возможность получить доступ к его данным.
Передача ссылки на объект Lot (self) в объект Pay при создании может быть правильным решением, если вам действительно необходим доступ к данным пользователя из класса Pay. Однако, следует следить за тем, чтобы не создавать сильную связанность между объектами, чтобы избежать проблем с изменением структуры кода в будущем. Разбивайте функциональность на отдельные классы таким образом, чтобы каждый класс имел четко определенную ответственность.