在不同类型的对象之间传递私有属性

时间:2018-10-25 09:08:08

标签: php class oop

我有以下一些想要使它们彼此协作的对象。用户可以在不同的时间创建彼此分离的每个对象。最终用途是用户将所有对象链接在一起以组成最终对象。

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);而且,他们唯一会继承的是一块田地。这就像我的耳朵一样浪费。

在可能的情况下,我想将它们像某些组件一样对待。

1 个答案:

答案 0 :(得分:-1)

您可以让InvoiceHeader持有一个TransmissionData对象(由您当前的set方法设置),并让TransmissionData对象公开一个方法来获取生成的XML,这样您就不必公开原始属性,只需公开所得的XML块?

类似地,Invoice可以拥有Invoice标头对象属性,而InvoiceHeader公开了另一种方法来获取所需的XML,又将属性编辑保留在核心类中,并且仅以消耗性格式公开数据?

如果在任何时候都需要将XML的多个部分放入最终结果的各个位置,则可以为每个必需的块公开许多方法。

我不会在这里尝试输入php代码-我很生锈!