(PHP)如何将以前的INCLUDE / REQUIRE调用传递给子文件?

时间:2012-03-21 23:04:37

标签: php include require ob-get-contents

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

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

  • 的index.php
  • header.html中
  • footer.html
  • 的functions.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()文件

2 个答案:

答案 0 :(得分:1)

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

所以答案是:你不能用输出缓冲来做。或者使用include ob_start之前include_once您的文件。

答案 1 :(得分: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_onceinclude_once $file;),PHP会为您完成。

虽然我建议您确保文件加载结构的形状使得这些事件永远不会发生。