【问题标题】:Using header("Location") from a template include file / Process include and save in variable使用模板包含文件中的标头(“位置”)/处理包含并保存在变量中
【发布时间】:2010-06-28 19:10:33
【问题描述】:

我正在想办法做到这一点:

我想要一个核心模板文件(structure.php):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<?php include_once(NAKIDROOT."includes/head.php"); ?>
</head>
<body>
<div id="all">
  <div id="page">
    <?php include_once("includes/header.php"); ?>
    <div id="main">
      <div id="left">
        <?php include_once("includes/left.php"); ?>
      </div>
      <div id="content">
      <?php include_once("includes/messages.php"); ?>
      <?php include_once("includes/page.php"); ?>
      </div>
      <?php include_once("includes/footer.php"); ?>
    </div>
  </div>
</div>
</body>
</html>

如果需要,我希望包含能够运行 header(Location),所以我似乎需要以某种方式让 php 读取每个包含文件。

有没有办法渲染包含以首先检查标题和内容,并将其内容放入变量中,所以我的结构文件会变成这样?:

<div id="page">
    <?php echo($header); ?>
    <div id="main">
      <div id="left">
        <?php echo($left); ?>
      </div>
      <div id="content">
      <?php echo($messages); ?>
      <?php echo($page); ?>
      </div>
      <?php echo($footer); ?>
    </div>
  </div>

【问题讨论】:

  • 也许真正的问题是你的视图驱动了你的页面。

标签: php redirect variables include header


【解决方案1】:

在 HTTP 响应正文开始后,您无法发送标头(即,在您输出某些内容之后,这包括 &lt;?php 标记之外的内容)。一个快速的解决方法是使用ob_start() 和相关函数来使用输出缓冲。不过,这只是创可贴;您应该尝试重构您的代码,以便尽可能不必依赖输出缓冲。

要使用ob_start(),只需在脚本顶部调用它并在脚本底部调用ob_end_flush()

【讨论】:

  • 打败我。输出缓冲将允许您的包含发送标头,因为在您显式发送内容或脚本终止之前实际上不会发送任何内容。
  • +1 表示“这只是一个创可贴;您应该尝试重新构建代码,以便尽可能不必依赖输出缓冲。”
  • 使用输出缓冲的可用性/坏/慢如何?我正在为我正在开发的 CMS 尝试这种方法,该 CMS 可以分布在多个 linux 服务器上,这就是为什么我确实想保持包含页面文件非常简单
  • 与其说是速度,不如说是应用程序的架构。通常,您不应该将表示逻辑与业务逻辑混为一谈。您可能希望实现关注点分离。执行此操作的一种架构设计模式称为 MVC(模型-视图-控制器)。这在 SO 上解释得太多了,所以试着查一下这些东西。目前,在您更有经验之前,输出缓冲可能就足够了,但至少值得牢记。
猜你喜欢
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 2015-06-21
  • 2011-10-06
  • 1970-01-01
相关资源
最近更新 更多