# Методы цепочкой в классе Tag

Давайте вынесем добавление атрибутов из конструктора в отдельный метод `setAttr`. Пусть при этом наш метод позволяет добавлять только один атрибут, а чтобы добавить несколько атрибутов - нужно будет вызвать несколько методов в виде цепочки.

Смотрите пример использования нашего метода:

`<?php $tag = new Tag('input'); echo $tag->setAttr('id', 'test')->setAttr('class', 'eee bbb')->open(); ?>`

С комментариями:

`<?php $tag = new Tag('input'); echo $tag ->setAttr('id', 'test') // добавляем атрибут 'id' ->setAttr('class', 'eee bbb') // добавляем атрибут 'class' ->open(); // выведет <input id="test" class="eee bbb"> ?>`

Пока мы предполагаем, что наша цепочка всегда завершается методом `open`. Если тег должен иметь еще и закрывающую часть, то мы будем вызывать метод `close` вне цепочки, вот так:

`<?php $tag = new Tag('div'); echo $tag->setAttr('id', 'test')->open(); // откроем тег echo $tag->close(); // закроем тег ?>`

Итак, давайте реализуем метод `setAttr` в нашем классе:

`<?php class Tag { private $name; private $attrs = []; // изначально пустой массив public function __construct($name) { $this->name = $name; } // Реализуем метод для атрибутов: public function setAttr($name, $value) { $this->attrs[$name] = $value; return $this; // возвращаем $this чтобы была цепочка } public function open() { $name = $this->name; $attrsStr = $this->getAttrsStr($this->attrs); return "<$name$attrsStr>"; } public function close() { $name = $this->name; return "</$name>"; } private function getAttrsStr($attrs) { if (!empty($attrs)) { $result = ''; foreach ($attrs as $name => $value) { $result .= " $name=\"$value\""; } return $result; } else { return ''; } } } ?>`

Самостоятельно добавьте метод `setAttr` в созданный вами в предыдущем уроке класс `Tag`.

Реализуйте метод `removeAttr`, который будет удалять переданный параметром атрибут. Сделайте так, чтобы этот метод также мог принимать участие в цепочке.

← →
↑