Как вы eval () PHP-код через несколько уровней? - PullRequest
0 голосов
/ 30 января 2010

У меня есть этот код:

$layout_template = template_get("Layout");
$output_template = template_get("Homepage");
$box = box("Test","Test","Test");
eval("\$output = \"$layout_template\";");
echo $output;

В переменной $ template_layout есть вызов для переменная $ output_template, поэтому скрипт перемещается в переменную $ output_template

Но это не идет дальше, внутри $ output_template есть вызов переменной $ box, но он не идет дальше одного уровня

1 Ответ

2 голосов
/ 30 января 2010

Я бы никогда не хотел бы вложенных eval(), и особенно не в какой-либо рекурсивной логике. Плохие новости. Вместо этого используйте Включить PHP . IIRC eval() создает новый контекст выполнения с дополнительными издержками, тогда как include() нет.

Если у вас есть такие буферы, как:

<h1><?php echo $myCMS['title']; ?></h1>

У меня иногда есть файлы типа Index.tpl, такие как выше, которые обращаются к ассоциативному массиву, как это, тогда вы просто делаете в своем классе:

<?php
   class TemplateEngine {
       ...
       public function setvar($name, $val)
       {
            $this->varTable[$name]=make_safe($val);
       }

       ....
       /* Get contents of file through include() into a variable */
       public function render( $moreVars )
       {
           flush();
           ob_start();
           include('file.php');
           $contents = ob_get_clean();
           /* $contents contains an eval()-like processed string */
           ...

Оформить заказ ob_start () и другие элементы управления выходным буфером

Если вы используете eval() или любой другой тип включения пользовательских данных , будьте очень осторожны при очистке входных данных для некорректного кода.

Похоже, вы пишете комбинированную систему виджетов / шаблонов. Напишите свои виджеты (представления) как классы и разрешите их использование в существующих системах шаблонов . Сохраняйте общее для $myWidget->render($model) и т. Д.

Я видел это на PHP doc-user-comments-thingy, и это кажется плохой идеей:

<?php
$var = 'dynamic content';
echo eval('?>' . file_get_contents('template.phtml') . '<?');
?>

Возможно, кто-то может просветить меня об этом: P

...