Подходит ли использование php-деструктора для отображения HTML? - PullRequest
4 голосов
/ 14 октября 2010

Если реализован класс, который создает HTML для страницы, создавая ее и вызывая различные методы, уместно ли определять часть отображения / эха класса внутри деструктора?

Вместо того, чтобы иметь явный метод Class:displayHTML();, иметь echo $this->html в деструкторе и всякий раз, когда вы готовы отобразить вызов unset($object);, который бы отображал его?

Я знаю, что деструктор, вероятно, не лучшее место для этого, но интересно, что другие думают об этом?

Ответы [ 4 ]

10 голосов
/ 14 октября 2010

Это звучит нереально для меня.unset не равно эхо.Это принципиально другая вещь.Кроме того, имейте в виду, что объекты уничтожаются не только в unset, но также в тех случаях, когда на них больше нет ссылок и / или когда сценарий завершается.Это имеет большой потенциал для нежелательных побочных эффектов.

Если вы не хотите иметь / вызывать метод displayHTML() или render(), внедрите эту часть в __toString() и просто отобразите экземпляр.

class HTMLSomething
{
    /* ... */
    public function __toString()
    {
        /* create $output */
        return $output;
    }
}
$something = new HTMLSomething;
echo $something;
6 голосов
/ 14 октября 2010

Какой из этих двух имеет более очевидный результат?

unset($object);

или

$object->displayHTML();

Подумайте об этом, а затем прочитайте о принципе наименьшего удивления .

1 голос
/ 14 октября 2010

Это не тот путь, потому что у вас нет полного контроля над вашим деструктором. Деструктор будет вызван, когда ваш сценарий завершится, но вы можете не захотеть отображать что-либо при определенных условиях (скажем: загрузка, проверка, проверка не пройдена, отображение чего-то еще).

Кроме того, как отметил Доминик, существует проблема читабельности. Вы не хотите читать свой код год спустя и сказать: Почему я отменяю объект? WTF я думал тогда?! . Как вы можете видеть, это увеличит соотношение WTF / минута, и мы все знаем, что это плохо.

1 голос
/ 14 октября 2010

Похоже, плохая идея. Я действительно не вижу этого:

unset($view);

как лучше

$view->displayHTML();

Кажется, единственным реальным преимуществом является то, что вам не нужно вызывать unset() (так как в конце сценария это должно произойти).

Однако разве это хорошо? Как тогда вы предотвращаете его отображение? Как только это установлено, вы не можете. Или вам понадобится специальная функция clear(), чтобы сбросить вывод, прежде чем он будет автоматически выведен деструктором.

Для меня я не вижу здесь преимущества.

...