У меня есть следующие объекты, которые я бы хотел, чтобы они взаимодействовали между собой. Пользователь мог создавать каждый объект отдельно от других и в разное время. Конечное использование состоит в том, что пользователь связывает все объекты вместе, чтобы составить окончательный.
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); кроме того, единственное, что они унаследовали бы, - это поле ... для моих ушей оно похоже на расточительство.
Я бы хотел относиться к ним больше как к некоторым компонентам, если это возможно.
Либо вы меняете видимость свойства, либо создаете метод доступа, как упомянул Джефф.
или как насчет наличия свойства $invoice и $invoiceHeader в TransmissionData. Затем вы можете использовать их методы в TransmissionData.
@Jeff Если я использую «общедоступный» геттер, то в чем смысл инкапсуляции и сокрытия реализации? Пользователь мог просто использовать getXML () для каждого объекта, а затем обрабатывать весь документ XML-дерева в своей собственной программе без необходимости в родительских компонентах, которые защищают реализацию. Однако я не думаю, что есть другие способы, кроме использования наследования, чтобы избежать «публичной» видимости на данном этапе.
@Jeff Проблема в том, что пользователь может создать объект TransmissionData до того, как он создаст родительские объекты (Invoice и InvoiceHeader), поэтому эти свойства не будут связаны друг с другом. Я бы хотел, чтобы пользователь был обязан создать родительские объекты и ЗАТЕМ заполнить их дочерними объектами.






У вас может быть InvoiceHeader, содержащий объект TransmissionData (установленный вашим текущим методом набора), и объект TransmissionData, предоставляющий метод для получения сгенерированного XML, чтобы вам не нужно было открывать необработанные свойства, а только результирующий блок XML?
Точно так же Invoice может содержать свойство объекта заголовка Invoice, а InvoiceHeader предоставляет другой метод для получения требуемого XML, снова сохраняя редактирование свойств в основном классе и предоставляя данные только в расходуемом формате?
Если в какой-то момент требуется несколько разделов XML для размещения в разных местах конечного результата, вы можете предоставить несколько методов для каждого необходимого блока.
Я не буду пытаться набирать здесь php-код - я уже ржавый!
Да, идея моей реализации заключается в том, что каждый объект должен предоставлять «услугу» своему родительскому объекту. Таким образом, каждый объект обрабатывает только свое собственное дерево и делегирует операцию слияния своему родителю. Однако я бы хотел, чтобы эта «служба» не была общедоступной для конечного пользователя, а была доступна только между объектами. Я думаю, что нет другого выхода, кроме наследования объектов.
Основываясь на моем опыте работы с C++ / C#, я искал аналог в PHP. Вы смотрели классы «Friend»? wiki.php.net/rfc/friend-classesstackoverflow.com/questions/317835/…
как насчет реализации простого геттера
getXml()?