Окончательный вариант класса Tag
В данном уроке я приведу окончательный вариант
класса Tag
, который мы и будем использовать
в дальнейшем в следующих уроках.
Так как код класса достаточно большой и в нем много методов, было бы удобно сделать так, чтобы наш класс реализовывал некоторый интерфейс, в котором в компактном виде были бы прописаны все публичные методы, который должен иметь наш класс.
Добавим в интерфейс все публичные методы, описанные в уроках, а также те методы, которые были описаны в виде задач.
Итак, вот наш интерфейс:
<?php
interface iTag
{
// Геттер имени:
public function getName();
// Геттер текста:
public function getText();
// Геттер всех атрибутов:
public function getAttrs();
// Геттер одного атрибута по имени:
public function getAttr($name);
// Открывающий тег, текст и закрывающий тег:
public function show();
// Открывающий тег:
public function open();
// Закрывающий тег:
public function close();
// Установка текста:
public function setText($text);
// Установка атрибута:
public function setAttr($name, $value = true);
// Установка атрибутов:
public function setAttrs($attrs);
// Удаление атрибута:
public function removeAttr($name);
// Установка класса:
public function addClass($className);
// Удаление класса:
public function removeClass($className);
}
?>
А вот код нашего класса Tag
, реализующего
интерфейс iTag
:
<?php
class Tag implements iTag
{
private $name;
private $attrs = [];
private $text = '';
public function __construct($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
public function getText()
{
return $this->text;
}
public function getAttrs()
{
return $this->attrs;
}
public function getAttr($name)
{
if (isset($this->attrs[$name])) {
return $this->attrs[$name];
} else {
return null;
}
}
public function show()
{
return $this->open() . $this->text . $this->close();
}
public function open()
{
$name = $this->name;
$attrsStr = $this->getAttrsStr($this->attrs);
return "<$name$attrsStr>";
}
public function close()
{
$name = $this->name;
return "</$name>";
}
public function setText($text)
{
$this->text = $text;
return $this;
}
public function setAttr($name, $value = true)
{
$this->attrs[$name] = $value;
return $this;
}
public function setAttrs($attrs)
{
foreach ($attrs as $name => $value) {
$this->setAttr($name, $value);
}
return $this;
}
public function removeAttr($name)
{
unset($this->attrs[$name]);
return $this;
}
public function addClass($className)
{
if (isset($this->attrs['class'])) {
$classNames = explode(' ', $this->attrs['class']);
if (!in_array($className, $classNames)) {
$classNames[] = $className;
$this->attrs['class'] = implode(' ', $classNames);
}
} else {
$this->attrs['class'] = $className;
}
return $this;
}
public function removeClass($className)
{
if (isset($this->attrs['class'])) {
$classNames = explode(' ', $this->attrs['class']);
if (in_array($className, $classNames)) {
$classNames = $this->removeElem($className, $classNames);
$this->attrs['class'] = implode(' ', $classNames);
}
}
return $this;
}
private function getAttrsStr($attrs)
{
if (!empty($attrs)) {
$result = '';
foreach ($attrs as $name => $value) {
if ($value === true) {
$result .= " $name";
} else {
$result .= " $name=\"$value\"";
}
}
return $result;
} else {
return '';
}
}
private function removeElem($elem, $arr)
{
$key = array_search($elem, $arr);
array_splice($arr, $key, 1);
return $arr;
}
}
?>