1

ob_get_contents()我正在使用作为核心方法创建自己的模板脚本。通过使用它,它可以渲染出其他文件,从一个文件中调用。

就像,假设我们有 4 个文件:

  • 索引.php
  • header.html
  • 页脚.html
  • 函数.php

index.php将调用并呈现其他文件的内容(此处为 2 个 html 文件)。通过使用以下代码:

//index.php
function render($file) {
    if (file_exists($file)) {
    ob_start();
    include($file);
    $content = ob_get_contents();
    ob_end_clean();
    return $content;
    }
}
echo render('header.html');
echo render('footer.html');

但是(例如)当header.html包含一个调用时include('functions.php'),包含的文件(functions.php)不能在footer.html. 我的意思是,我必须再次包含在footer.html. 所以在这里,该行include('functions.php')必须包含在两个文件中。

如何在include()不从子文件再次调用的情况下创建文件

4

2 回答 2

1

当您使用ob_start()(输出缓冲)时,您最终只会得到文件的输出,这意味着执行输出的文件由ob_get_content(). 由于仅返回输出,其他文件不知道包含。

所以答案是:你不能用输出缓冲来做到这一点。或者include你在 ob_start 之前的文件include_once

于 2012-03-21T23:13:55.710 回答
1

这可以像这样工作:

//index.php
function render($file) {
    if(!isset($GLOBALS['included'])) {
        $GLOBALS['included'] = array();
    } 

    if (!in_array($file, $GLOBALS['included']) && file_exists($file)) {
        ob_start();
        include($file);
        $content = ob_get_contents();
        ob_end_clean();

        $GLOBALS['included'][] = $file;
        return $content;
    }
}

echo render('header.html');
echo render('footer.html');

或者,您可以使用include_once ( include_once $file;),PHP 会为您完成。

尽管我建议您确保文件加载结构的形状不会发生这些事件。

于 2012-03-21T23:16:05.333 回答