Если реализован класс, который создает HTML для страницы, создавая его и вызывая различные методы, целесообразно ли определять часть отображения / эха класса внутри деструктора?
Вместо явного Class:displayHTML();
метод, имеющий echo $this->html
в деструкторе и всякий раз, когда вы готовы отображать вызов unset($object);
который будет отображать его?
Я знаю, что деструктор, вероятно, не лучшее место для этого, но задайтесь вопросом, что на это другие мысли?
Это не кажется мне возможным. unset не равно echo. Это принципиально другая вещь. Также имейте в виду, что объекты не только уничтожаются, но и когда они больше не ссылаются и / или когда сценарий заканчивается. Это имеет большой потенциал для нежелательных побочных эффектов.
Если вы не хотите / вызывать displayHTML()
или render()
, реализуйте эту часть в __toString()
и просто эхо экземпляр.
class HTMLSomething { /* ... */ public function __toString() { /* create $output */ return $output; } } $something = new HTMLSomething; echo $something;
Какой из этих двух имеет более очевидный результат?
unset($object);
или:
$object->displayHTML();
Подумайте об этом, а затем прочитайте о Принципе наименьшего удивления .
Это не путь, потому что у вас нет полного контроля над вашим деструктором. Деструктор вызывается, когда ваш скрипт заканчивается, но вы можете не отображать что-либо в определенных условиях (скажем: загрузка, проверка, проверка не выполняется, отображение чего-то еще).
Кроме того, как отметил Доминик, есть вопрос читаемости. Вы не хотите читать свой код через год и говорите: почему я отключил объект? WTF я думал тогда? , Как вы можете видеть, это увеличит отношение WTF / минута, и мы все знаем, что это плохо.
Кажется, плохая идея. Я действительно не вижу этого:
unset($view);
как лучше, чем это
$view->displayHTML();
Кажется, единственное реальное преимущество в том, что вам действительно не нужно вызывать unset()
(поскольку в конце сценария это должно произойти).
Однако, это действительно хорошо? Как же вы препятствуете его отображению? Как только он будет установлен, вы не сможете. Или вам понадобится специальная функция clear()
чтобы отключить вывод, прежде чем он будет автоматически выведен деструктором.
Для меня я не вижу преимущества здесь.