在包含()之前使用变量

时间:2010-05-14 17:20:54

标签: php html

我正在使用一个文件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,如果我不需要,我宁愿不将它作为依赖项引入。

2 个答案:

答案 0 :(得分:2)

大多数人将包含页面的输出存储到另一个变量中。您是否尝试将所包含页面的所有内容放入输出缓冲区,然后将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(); ?>

答案 1 :(得分:1)

我能想到的最好的事情是将文件包含在渲染中。所以你的模板看起来像这样:

<?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(),这样模板就可以将信息传递给它所包含的页面。