Я бы никогда не хотел бы вложенных 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