【问题标题】:Is using php destructor appropriate for displaying HTML?使用 php 析构函数是否适合显示 HTML?
【发布时间】:2011-04-25 09:29:18
【问题描述】:

如果实现了一个通过构造页面并调用各种方法来为页面构建 HTML 的类,那么在析构函数中定义该类的显示/回显部分是否合适?

不是有一个显式的Class:displayHTML(); 方法,而是在析构函数中使用echo $this->html,并且每当您准备好显示调用unset($object); 时会显示它?

我知道析构函数可能不是最好的地方,但想知道其他人对此有何看法?

【问题讨论】:

  • 为什么要混淆自己的代码?

标签: php destructor


【解决方案1】:

这对我来说听起来不可行。未设置不等于回声。这是一个根本不同的事情。另外,请记住,对象不仅在unset 上被销毁,而且在它们不再被引用和/或脚本终止时也会被销毁。这很可能会产生不必要的副作用。

如果您不想拥有/调用 displayHTML()render() 方法,请在 __toString() 中实现该部分并回显该实例。

class HTMLSomething
{
    /* ... */
    public function __toString()
    {
        /* create $output */
        return $output;
    }
}
$something = new HTMLSomething;
echo $something;

【讨论】:

  • 我完全忘记了 __toString 方法。很好的答案。
  • 另外,脚本结束时也会调用 __deconstruct(),所以即使没有设置它也会被调用,这可能会导致一些奇怪的行为
【解决方案2】:

这两个哪个结果更明显?

unset($object);

或:

$object->displayHTML();

想一想,然后去阅读Principle of Least Astonishment

【讨论】:

  • 同意。让析构函数输出 HTML 是完全出乎意料的结果。
  • 这是一个很好的参考链接,我希望我能接受两个答案!
【解决方案3】:

这不是要走的路,因为您无法完全控制您的析构函数。当您的脚本完成时将调用析构函数,但您可能不想在某些条件下显示任何内容(例如:加载、验证、验证失败、显示其他内容)。

此外,正如 Dominic 所指出的,还有可读性问题。您不想在一年后阅读您的代码并说:我为什么要取消设置对象? WTF 我当时在想什么?! 。如您所见,这会增加 WTF/分钟比率,我们都知道这是一件坏事。

【讨论】:

    【解决方案4】:

    似乎是个坏主意。我真的没有看到这个:

    unset($view);
    

    比这更好

    $view->displayHTML();
    

    似乎唯一真正的优势是您实际上不需要调用unset()(因为在脚本末尾应该发生)。

    但是,这真的是一件好事吗?那么如何防止它被显示呢?设置好了就不行了。或者,您需要一个特殊的 clear() 函数来取消设置输出,然后再由析构函数自动输出。

    对我来说,我认为这里没有优势。

    【讨论】:

      猜你喜欢
      • 2014-10-23
      • 1970-01-01
      • 2011-10-17
      • 2018-10-07
      • 2016-03-29
      • 2012-10-10
      • 1970-01-01
      • 2012-11-05
      • 2013-06-25
      相关资源
      最近更新 更多