Перемещение метода open в класс Image с помощью магического метода __toString
В классе Tag у нас есть два метода,
которые используются для завершения цепочки
и вывода тега на экран: это метод open
и метод show.
Почему у нас два метода: потому что класс
Tag универсальный и предполагает использование
как для тегов, не требующих закрытия, так
и для парных тегов.
Очевидно, что при использовании класса Image
мы всегда будем завершать цепочку методом
open. Раз так, то давайте сделаем
использование метода open не обязательным.
То есть вместо этого:
<?php
echo (new Image())->setAttr('src', 'img.png')->open();
?>
Мы будем писать вот так:
<?php
echo (new Image())->setAttr('src', 'img.png');
?>
Используем для этого магический метод __toString:
<?php
class Image extends Tag
{
public function __construct()
{
$this->setAttr('src', '')->setAttr('alt', '');
parent::__construct('img');
}
public function __toString()
{
return parent::open(); // вызываем метод родителя
}
}
?>
Теперь получается, что при попытке преобразования
объекта в строку, например, при выводе его
через echo, автоматически будет вызываться
метод __toString, внутри которого
будет вызываться метод open.
Напоминаю, что если не выводить объект на экран, а, например, записать в переменную, то в эту переменную попадет объект, а не его строковое представление:
<?php
// В переменную $image запишется объект:
$image = (new Image())->setAttr('src', 'img.png');
$image->setAttr('width', '200'); // вызовем еще метод
echo $image; // тут сработает __toString
?>
Самостоятельно напишите реализацию метода
__toString.