offline version v3
Запись на курсы по HTML, CSS, JavaScript, PHP, фреймворкам и CMS,
а также: помощь в поиске работы и заказов, стажировка на реальных проектах→
⊗ppOpClImgOTS 107 of 179 menu

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