Передача частной собственности между объектами разного типа

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

Invoice.php

<?php
class Invoice
{
  private $header;
  private $xml;

  public function __construct()
  {
    // code that initializes $this XML tree (root)
  }

  public function setInvoiceHeader($invoiceHeader)
  {
       /* code that should merge $this->xml with the one from the $invoiceHeader param
       but I can't access it here because of private visibility and I would like to avoid
       the public visibility */
  }

  public function writeXMLDocument()
  {
    // code that returns the XML document
  }

}
?>

InvoiceHeader.php

<?php
class InvoiceHeader
{
  private $xml;

  public function __construct()
  {
    // code that initializes $this XML tree
  }

  public function setTransmissionData($transmissionData)
  {
    /* code that should merge $this->xml with the one from the $transmissionData param
       but I can't access it here because of private visibility and I would like to avoid
       the public visibility */
  }

}
?>

TransmissionData.php

<?php
class TransmissionData
{
  private $xml;
  private $transmissionIdNode;

  public function __construct()
  {
    // code that initializes $this XML tree
  }

  public function setTransmissionId($idCountry, $idCode)
  {
    // code that creates the XML node with the params
  }

}
?>

Я не могу найти способ передать private $ xml между объектами.

Я бы хотел избежать использования видимости public, потому что я не хочу, чтобы пользователь мог получить доступ к низкоуровневой реализации.

Я бы хотел избежать использования наследования и видимости protected, потому что я думаю, что эти объекты не так уж связаны (InvoiceHeader не является Invoice, а TransmissionData не InvoiceHeader); кроме того, единственное, что они унаследовали бы, - это поле ... для моих ушей оно похоже на расточительство.

Я бы хотел относиться к ним больше как к некоторым компонентам, если это возможно.

как насчет реализации простого геттера getXml()?

Jeff 25.10.2018 11:11

Либо вы меняете видимость свойства, либо создаете метод доступа, как упомянул Джефф.

yivi 25.10.2018 11:32

или как насчет наличия свойства $invoice и $invoiceHeader в TransmissionData. Затем вы можете использовать их методы в TransmissionData.

Jeff 25.10.2018 12:04

@Jeff Если я использую «общедоступный» геттер, то в чем смысл инкапсуляции и сокрытия реализации? Пользователь мог просто использовать getXML () для каждого объекта, а затем обрабатывать весь документ XML-дерева в своей собственной программе без необходимости в родительских компонентах, которые защищают реализацию. Однако я не думаю, что есть другие способы, кроме использования наследования, чтобы избежать «публичной» видимости на данном этапе.

Etraz 29.10.2018 09:44

@Jeff Проблема в том, что пользователь может создать объект TransmissionData до того, как он создаст родительские объекты (Invoice и InvoiceHeader), поэтому эти свойства не будут связаны друг с другом. Я бы хотел, чтобы пользователь был обязан создать родительские объекты и ЗАТЕМ заполнить их дочерними объектами.

Etraz 29.10.2018 09:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
36
1

Ответы 1

У вас может быть InvoiceHeader, содержащий объект TransmissionData (установленный вашим текущим методом набора), и объект TransmissionData, предоставляющий метод для получения сгенерированного XML, чтобы вам не нужно было открывать необработанные свойства, а только результирующий блок XML?

Точно так же Invoice может содержать свойство объекта заголовка Invoice, а InvoiceHeader предоставляет другой метод для получения требуемого XML, снова сохраняя редактирование свойств в основном классе и предоставляя данные только в расходуемом формате?

Если в какой-то момент требуется несколько разделов XML для размещения в разных местах конечного результата, вы можете предоставить несколько методов для каждого необходимого блока.

Я не буду пытаться набирать здесь php-код - я уже ржавый!

Да, идея моей реализации заключается в том, что каждый объект должен предоставлять «услугу» своему родительскому объекту. Таким образом, каждый объект обрабатывает только свое собственное дерево и делегирует операцию слияния своему родителю. Однако я бы хотел, чтобы эта «служба» не была общедоступной для конечного пользователя, а была доступна только между объектами. Я думаю, что нет другого выхода, кроме наследования объектов.

Etraz 29.10.2018 10:00

Основываясь на моем опыте работы с C++ / C#, я искал аналог в PHP. Вы смотрели классы «Friend»? wiki.php.net/rfc/friend-classesstackoverflow.com/questions/317835/…

SazooCat 30.10.2018 10:12

Другие вопросы по теме