Методы цепочкой в классе 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, который будет удалять переданный параметром атрибут. Сделайте так, чтобы этот метод также мог принимать участие в цепочке.