ОбзорPHP - templating с пользовательскими тегами - это законное использование eval?
Примерно в конце 2009 года я написал простую шаблонную систему для PHP/HTML для использования в доме нашими дизайнерами для веб-сайтов типа брошюры-Ware. Целью системы является создание шаблонов в иначе чистом HTML через пользовательские теги, которые обрабатываются PHP. Например, шаблонный страница может выглядеть следующим образом:
<tt:Page template="templates/main.html">
<tt:Content name="leftColumn">
<p> blah blah </p>
...
</tt:Content>
<tt:Content name="rightColumn">
<p> blah blah </p>
...
</tt:Content>
</tt:Page>
шаблон, сама может выглядеть примерно так:
<html>
<head>...</head>
<body>
<div style="float:left; width:45%">
<tt:Container name="leftColumn" />
</div>
<div style="width:45%">
<tt:Container name="rightColumn" />
</div>
</body>
</html>
Помимо страниц и контента/теги контейнеров, есть несколько других тегов включены в основном для таких вещей, как управление потоком, итерация по коллекции, вывод динамических значений и т. д. Структура разработана таким образом, что очень легко добавить свой собственный набор тегов, зарегистрированных под другим префиксом и пространством имен.
Пользовательские теги для PHP
Как мы разбираем эти пользовательские теги? Поскольку это не гарантирует, что HTML-файл является хорошо сформированным XML, такие решения, как XSLT/XPATH, не будут надежными. Вместо этого мы используем регулярное выражение для поиска тегов с зарегистрированными префиксами и заменяем их кодом PHP. PHP-код представляет собой конструкцию на основе стека ... при столкновении с открывающим тегом создается объект, представляющий тэг, который помещается в стек, и запускается его «функция инициализации» (если таковая имеется). Всякий раз, когда встречается зарегистрированный закрывающий тег, последний стек вылетает из стека и запускается его «функция рендеринга».
Таким образом, после того, как основа заменяет шаблонных тегов с PHP, наш пример страницы может выглядеть следующим образом (в недвижимости это немного уродливее):
<?php $tags->push('tt', 'Page', array('template'=>'templates/main.html')); ?>
<?php $tags->push('tt', 'Content', array('name'=>'leftColumn')); ?>
<p> blah blah </p>
...
<?php $tags->pop(); ?>
<?php $tags->push('tt', 'Content', array('name'=>'rightColumn')); ?>
<p> blah blah </p>
...
<?php $tags->pop(); ?>
<?php $tags->pop(); ?>
Хороший, плохой, и eval
Теперь, как выполнить наш недавно сгенерированный PHP-код? Я могу придумать несколько вариантов. Проще всего просто проложить строку, и это работает достаточно хорошо. Однако любой программист скажет вам, что «eval - это зло, не используйте его ...», поэтому вопрос в том, есть ли что-то более подходящее, чем eval
, которое мы можем использовать здесь?
Я рассмотрел использование временного или кэшированного файла с использованием потоков вывода php://
и т. Д., Но, насколько я вижу, они не предлагают никаких реальных преимуществ перед eval
. Кэширование может ускорить процесс, но на практике все сайты, которые мы имеем на эту вещь, уже невероятно быстры, поэтому я не вижу необходимости в оптимизации скорости на этом этапе.
Вопросы
Для каждой из вещей в этом списке: это хорошая идея? Можете ли вы подумать о лучшей альтернативе?
- вся идея в целом (пользовательские теги HTML/PHP)
- преобразования тегов в PHP кода вместо обработки непосредственно
- подход стека на основе
- использование
eval
(или аналогичный)
Спасибо за чтение и TIA за любые советы. :)
+1 для хорошо отформатированного, хорошо написанного и хорошо продуманного вопроса. – gpmcadam
Спасибо. OT: Мне нравится ваш аватар. Гигантор из Evol Intent был одет в футболку с таким же дизайном, когда он приехал сюда несколько лет назад. Это логотип для лейбла или что-то еще, или просто случайный дизайн? Интересно, что годами. –