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