ООП / PHP: возможно ли иметь поведение по умолчанию для каждого метода класса? - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь стать лучше с шаблонами ООП.

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

Я создал приватную функцию, которая создает заголовок и возвращает XML-объект, где конкретный метод get добавляет свои дочерние узлы в соответствии с потребностями.Я сделал приватную функцию, которая украшает XML (если установлен) и закрывает его блоком «нижнего колонтитула» по умолчанию.

Я размышляю, есть ли шаблон для его оптимизации и убедитесь, что оба init_xml иprepeare_xml всегда вызываются в начале и в конце каждого открытого метода.Можно ли построить класс таким образом, чтобы каждый открытый вызов метода вызывал 1-й метод заголовка и после добавления дочерних узлов метод нижнего колонтитула?

Есть один метод get_xml ($ type, $ data), которыйвызывает конкретные методы get _? _ xml в соответствии с $ type?Или есть лучший образец?

Надеюсь, этот пример имеет смысл

class Foo{
  private $xml;

  public function get_bar_xml($data){
    $this->xml = $this->init_xml();

    foreach($data as $key => $value){
      $this->xml->addChild(key, $value);
    }

    return $this->prepare_xml();
  }

  //... set of similar methods following with different
  // child node creation

  private function init_xml(){
    //$this->xml header generation
  }

  private function prepare_xml(){
    //add footer nodes to $this->xml
    //format output if neccesary 

    return $this->xml;
  }
}

1 Ответ

0 голосов
/ 14 декабря 2018

Похоже, что Foo является одиночным или, по крайней мере, создается только один раз, а затем создает много файлов XML?Вы должны скорее увидеть один экземпляр объекта как один XML-документ:

class Foo {
    protected $xml;

    public function __construct() {
        $this->xml = /* whatever */;
        // add headers
    }

    public function add($data) {
        // write $data to xml
    }

    public function asXML() {
        $this->writeFooter();
        return (string)$this->xml; // or whatever
    }
}

Вы можете сделать его базовым классом, и различные типы документов расширят его, чтобы настроить только метод add для своих нужд.Затем он будет использоваться следующим образом:

$foo = new Foo;
foreach ($data as $d) {
    $foo->add($d);
}
echo $foo->asXML();

Если вы хотите создать следующий документ, не используйте повторно $foo, создайте экземпляр new Foo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...