Простые шаблоны PHP… может ли это работать без eval?

Обновление - Спасибо за все ответы. Этот вопрос становится немного запутанным, поэтому я начал продолжение , если кому-то интересно.


Я составлял быстрый сценарий для друга и наткнулся на действительно простой способ создания шаблонов на PHP.

По сути, идея состоит в том, чтобы проанализировать html-документ как строку heredoc, поэтому переменные внутри него будут расширены PHP.

Функция сквозной передачи позволяет выполнять оценку выражений и вызовы функций и статических методов внутри строки:

function passthrough($s){return $s;}
$_="passthrough";

Код для анализа документа внутри строки heredoc до смешного прост:

$t=file_get_contents('my_template.html');
eval("\$r=<<<_END_OF_FILE_\n$t\_END_OF_FILE_;\n");
echo $r;

Единственная проблема в том, что он использует eval .

Вопросы

  • Может ли кто-нибудь придумать способ создания такого рода шаблонов без использования eval , но без добавления синтаксического анализатора или тонны безумия с регулярными выражениями?

  • Любые предложения, как избежать случайных знаков доллара, принадлежат ли переменным PHP без написания полноценного парсера? Не делает ли проблема случайного знака доллара этот подход непригодным для «серьезного» использования?


Вот образец HTML-кода с шаблоном.





{$lang['T_FILTER_TITLE']}

{$lang['T_FILTER_ALL']} {$filter_html}
{$table_rows} {$form_fields}
{$lang['T_FORM_HELP']}
 

Зачем использовать шаблоны?


Было некоторое обсуждение того, необходимо ли создание слоя шаблонов в PHP, который, по общему признанию, уже довольно хорош в создании шаблонов.

Несколько простых причин, по которым шаблонизация полезна:

  • Вы можете управлять им

    Если вы предварительно обработаете файл до того, как он попадет в интерпретатор, у вас будет больше контроля над Это. Вы можете вводить данные, блокировать разрешения, очищать от вредоносных php / javascript, кэшировать их, запускать через шаблон xsl и т. Д.

  • Хороший дизайн MVC

    Создание шаблонов способствует разделению представления от модели и контроллера.

    При входе и выходе из Php?> в вашем представлении, легко стать ленивым и выполнить несколько запросов к базе данных или выполнить какое-либо другое действие на сервере. Используя метод, подобный описанному выше, можно использовать только один оператор на «блок» (без точек с запятой), поэтому попасть в эту ловушку намного сложнее. = ...?> имеют примерно такое же преимущество, но ...

  • Короткие теги не всегда включены

    ... и мы хотим, чтобы наше приложение работало на различных конфигураций.

Когда я сначала собираю концепцию вместе, она начинается как один файл php. Но до того, как он вырастет, я не буду счастлив, если все файлы php не будут иметь только один Php в начале и один ?> в конце, и желательно все классы, кроме прочего например, контроллер, настройки, сервер изображений и т. д.

Мне вообще не нужно много PHP в моих представлениях, потому что дизайнеры сбиваются с толку, когда ткач снов или что-то еще гадит, когда видит что-то вроде этого:

">
  

Это достаточно сложно для программиста. Средний графический дизайнер и близко не пойдет. С чем-то вроде этого гораздо легче справиться:


Программист убрал свой неприятный код из html, и теперь дизайнер может творить чудеса дизайна. Ура!

Быстрое обновление

Принимая во внимание все советы, я думаю, что предварительная обработка файлов - это лучший способ, а промежуточные файлы должны быть как можно ближе к обычному шаблону php, а шаблоны являются синтаксическим сахаром . Eval все еще на месте, пока я играю с ним. Предмет как бы изменил свою роль. Я напишу позже и постараюсь ответить на некоторые из ответов, а пока ...

\\3) { ?>", 
        "", 
        "",
        "passthrough(", ")}\n$eot\n ?>",
        "",
        ), 
      $markup);
    ob_start(); 
    eval(" ?>$markupparse_markup(file_get_contents($file));
  }

}


// test stuff


$ht = new HereTemplate();
echo $ht->parse_file($argv[1]);


?>

...



{{each $_SERVER $key $value}

{{!print_r($value)}}
{each}}

16
задан Community 23 May 2017 в 12:06
поделиться