# Перемещение метода 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`.

← →
↑