【问题标题】:Why save output until the end?为什么要保存输出直到最后?
【发布时间】:2011-06-03 18:52:27
【问题描述】:

关于编程实践的非常简单的问题:

我一直使用 echo() 来将 HTML 代码在生成后立即输出给用户,同时使用 ob_start() 以便能够在代码的后面输出标题。最近,我意识到这是一种不好的编程习惯,我应该将 HTML 输出保存到最后。

这是有原因的吗?它是什么,为什么输出缓冲不是一个好的选择?

谢谢!

【问题讨论】:

  • output_buffer()是自定义函数吗?

标签: php output-buffering


【解决方案1】:

每当向浏览器发送任何 HTML 时,都会接收/创建标头。发生这种情况后,PHP 无法再发送任何标头。因此,通过“提前”发送代码,您将禁用 PHP 发送标头的能力,并限制代码的灵活性(无论是现在还是未来的更改)。

【讨论】:

  • 使用ob_start() 可以捕获缓冲区中的所有输出。
  • 我使用输出缓冲解决了这个问题。为什么这被认为是不好的做法?
  • @alex - 我正在解决“我应该将 HTML 输出保存到最后”。
  • @alex - 也没有两种类型的缓冲区,PHP 缓冲区和浏览器缓冲区?显然,根据浏览器,它们的刷新方式不同:stackoverflow.com/questions/4191385/…
  • @user - 如果您指的是早期的 HTML 输出,那么基本上不建议这样做,因为您无法在设计后期“改变主意”。
【解决方案2】:

最好在视图中输出之前处理各种事情 - 例如,您可能需要发送额外的标头,例如 LocationSet-Cookie

另外,你永远不知道你需要什么样的视图——这次的响应是 HTML,但是如果你以后想要它是 JSON 或 XML 怎么办?你将很难重组。

如果您将所有输出留给最终视图,则可以将 HTML 替换为 XML 模板。

【讨论】:

    【解决方案3】:

    一些想法,不一定按顺序。

    • 使用echo 输出 HTML 很麻烦。 PHP是一种模板语言,如果需要输出HTML,可以将其拆分出来:

      <?php echo "<div id=\"foo\">" . $bar . "</div>"; ?>
      

      <div id="foo"><?php echo $bar; ?></div>
      
    • 先生成 HTML 再输出标题是混乱的逻辑。先决定什么你想发送,然后发送适当的标题,然后产生内容。
    • 缓冲 HTML 以稍后发送标头本身并不是真正的问题,但它表明流程结构不良。
    • 您的应用可能会从逻辑步骤的一些划分/分解中受益。

    查看 MVC 模式。

    【讨论】:

    • 我想我理解你的逻辑步骤点,但我不确定它在某些情况下是否有帮助。请耐心等待,因为我不是专业程序员,但我一直在寻找优化代码的方法。假设我正在使用它来检查用户是否登录,如果没有,则将他们重定向回登录页面。做登录检查对我有好处吗?一开始重定向,一个显示内容,或者我应该使用输出缓冲,当我开始显示内容时只做一个?
    猜你喜欢
    • 2020-09-17
    • 2019-09-23
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    相关资源
    最近更新 更多