(PHP) Как передать предыдущие вызовы INCLUDE / REQUIRE в дочерние файлы? - PullRequest
1 голос
/ 22 марта 2012

Я создаю свой собственный шаблонный скрипт, используя 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 ]

1 голос
/ 22 марта 2012

Это может работать примерно так:

//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 сделает это за вас.

Хотя я предлагаю вам просто убедиться, что структура загрузки файлов находится в такой форме, чтобы эти события никогда не происходили.

1 голос
/ 22 марта 2012

Когда вы используете ob_start() (буферизация вывода), вы получаете только вывод файла, то есть файл, выполнивший вывод, возвращается ob_get_content(). Поскольку возвращается только вывод, что другой файл не знает о включениях.

Итак, ответ таков: вы не можете сделать это с помощью буферизации вывода. Или include ваши файлы перед ob_start с include_once.

...