Как я могу повторить php с помощью php?

Веб-сайт, который я разрабатываю, использует шаблон «заголовок» и «нижний колонтитул». Эти шаблоны включены на каждой странице сайта. Шаблон заголовка открывает HTML и содержит полный тег head, а затем открывает тег body. Шаблон нижнего колонтитула закрывает тег body, а затем закрывает HTML. Базовая структура выглядит следующим образом:

<?php
//Set the current page name so it can be highlighted in the menu bar
$page="Home";
//For page-specific HEAD includes
$headincludes=array("<some type of code>","<some other type of code>");
include("/assets/template/header.php");
?>
<!--START PAGE CONTENT-->
<!--END PAGE CONTENT-->
<?php
include("/assets/template/footer.php");
?>

Шаблон заголовка помещает массив «headincludes» в раздел head страницы следующим образом:

foreach ($headincludes as $toecho)
echo $toecho;

Этот метод отлично работает для таких вещей, как javascript, но когда я пытаюсь добавить оператор PHP, он заканчивается как не проанализированный PHP на последней странице, отображаемой в браузере. Есть ли какой-то специальный метод для повторения PHP с помощью PHP?


person bnrup    schedule 07.03.2011    source источник
comment
Не могли бы вы показать пример того, как вы добавляете статус php в массив $headincludes?   -  person Shakti Singh    schedule 07.03.2011
comment
Не могли бы вы просто вывести php-код без тегов <?php ?>?   -  person Shoe    schedule 07.03.2011


Ответы (8)


Способ выполнения PHP из строки — это eval(), однако это редко подходящий инструмент для использования.

Можете ли вы разместить нужный вам PHP выше $headincludes, а затем добавить его вывод в $headincludes?

<?php
//Set the current page name so it can be highlighted in the menu bar
$page="Home";

include 'generators.php';

$links = generateLinks('some_arg');

//For page-specific HEAD includes
$headincludes=array("<some type of code>","<some other type of code>", $links);
include("/assets/template/header.php");
...
person alex    schedule 07.03.2011
comment
Я понял, что гораздо проще использовать другой подход к структурированию — просто разделяя вещи на большее количество модулей. Теперь у меня есть файл для глобального кода страницы, раздел для кода заголовка страницы, файл для заголовка страницы и навигации, тело страницы и файл для нижнего колонтитула. Удивительно, насколько другая точка зрения может изменить ситуацию. - person bnrup; 17.10.2012

Да, eval() (читай evil()), однако вам лучше пересмотреть свой подход. Возможно, если вы хотите включить значительный объем PHP-кода, передайте массив файлов, которые можно включить в дальнейшем:

// at the beginning of the file
$includes = array('db.php', 'config.php');


// in your header, or footer (whichever is applicable)
foreach($includes as $file){
    if(file_exists($file)){
        include $file; // or include_once
    }
}

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

person Dan Lugg    schedule 07.03.2011
comment
Ммм, нет. evil() просто выполните php как строку. Это не позволяет вам повторять php. - person Shoe; 07.03.2011

Что вы добавляете в свой массив?

Если вы настраиваете свой php следующим образом:

$headincludes=array("$var1","$var2");

это не будет работать. Вы должны сделать так:

$headincludes=array($var1,$var2);
person j_freyre    schedule 07.03.2011
comment
"$var1" на самом деле должно работать, даже если интерполяция в строку не нужна. - person alex; 07.03.2011

Выполните код PHP в своих основных файлах и выгрузите результат в $headincludes. Код в заголовке выполнять не нужно, результат не изменится.

Или будет? Если вы на самом деле пытаетесь внедрить произвольный код в другой код, вы делаете это неправильно.

person deceze♦    schedule 07.03.2011

что за $headincludes

примечание: используйте include_once

person diEcho    schedule 07.03.2011

Вы пытались объединить строки. так

$headincludes=array("<your html code>".$variable."<more html>","<more>")
person yossi    schedule 07.03.2011

Попробуй это:

echo eval('?>html or javascript<?');
echo eval('php');
person grc    schedule 07.03.2011
comment
Потому что echo eval('?><div>foobar</div><?') намного проще, чем echo '<div>foobar</div>' или ?><div>foobar</div><?? - person deceze♦; 07.03.2011
comment
Потому что он позволяет php или html быть в массиве $headincludes=array("$x = 2+3;","?><div>foobar</div><?"); - person grc; 07.03.2011

Если вы попытаетесь вывести php-файл, конечно, вы сделаете это легко, но ваш браузер не сможет работать.

Итак, вам необходимо:

  • Оцените файл php и выведите результат

or

  • Создайте как-нибудь html-файл, который вы будете выводить вместо php-файла.

include_once() или include() в любом случае ваши друзья, он (точно так же, как читается имя) включает файл, и файл "выполняется" в этом самом месте. «Однажды» версия не будет включать один и тот же файл дважды, если он уже был включен ранее (полезно, если вы делаете несколько включений, которые, в свою очередь, делают другие включения).

person Alexander    schedule 07.03.2012