【问题标题】:Using variables before include()ing them在包含()之前使用变量
【发布时间】:2010-05-15 01:30:34
【问题描述】:

我正在使用一个文件 page.php 作为几个内容文件的 HTML 容器;也就是说,page.php 定义了页面的大部分常见结构,内容文件只包含每个页面唯一的文本。我想做的是在每个内容文件中包含一些 PHP 代码,这些文件定义了页面的元数据,例如其标题、要使用的横幅图形等。例如,内容文件可能看起来像这样(简化):

<?php $page_title="My Title"; ?>
<h1>Hello world!</h1>

文件名将作为 URL 参数传递给 page.php,如下所示:

<html>
  <head>
    <title><?php echo $page_title; ?></title>
  </head>
  <body>
    <?php include($_GET['page']); ?>
  </body>
</html>

这种方法的问题是变量在使用后才被定义,这当然是行不通的。输出缓冲似乎也无济于事。

我可以使用其他方法吗?我不希望将内容文件中的文本定义为 PHP heredoc 块,因为这会破坏我的文本编辑器中的 HTML 语法突出显示。我也不想在事后使用 JavaScript 重写页面元素,因为这些页面中的许多页面不使用 JavaScript,如果我不需要,我宁愿不将其作为依赖项引入。

【问题讨论】:

  • 为什么 ob_* 函数不适合你?当你尝试时会发生什么?
  • ob_* 函数可以工作,但它们不会改变页面的布局方式——在定义之前 $page_title 仍然没有值(这应该是,我想)。

标签: php html


【解决方案1】:

大多数人将包含页面的输出存储到另一个变量中。您是否尝试过将包含页面的所有内容放入输出缓冲区,然后将ob_get_clean() 存储到类似$page_html 的变量中,然后让您的页面看起来像这样:

<?php include($_GET['page']); ?>
<html>
  <head>
    <title><?php echo $page_title; ?></title>
  </head>
  <body>
    <?php echo $page_html; ?>
  </body>
</html>

编辑:所以第二页看起来像这样:

<?php
$page_title="My Title";
ob_start();
?>
<h1>Hello world!</h1>
<?php $page_html=ob_get_clean(); ?>

【讨论】:

    【解决方案2】:

    我能想到的最好的办法是将文件的包含与渲染分开。所以你的模板看起来像这样:

    <?php include($_GET['page']); ?>
    <html>
      <head>
        <title><?php echo $page_title; ?></title>
      </head>
      <body>
         <?php renderPage() ?>
      </body>
    </html>
    

    您包含的文件如下所示:

    <?php
    $page_title="My Title";
    function renderPage() {
    ?>
    <h1>Hello world!</h1>
    <?php 
    }
    ?>
    

    这也很好,因为您可以将参数传递给 renderPage(),以便模板可以将信息传递给它所包含的页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-20
      • 2011-04-12
      • 1970-01-01
      • 2016-02-23
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      相关资源
      最近更新 更多