2010-01-30 1 views
0

У меня есть этот код:Как вы оцениваете() код PHP через несколько уровней?

$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 является вызовом переменных $ поля, но он не идет дальше, чем на один уровень

+8

Каждый раз, когда вы звоните Eval() ангел умирает. –

+0

Как правило, вы НЕ используете eval(); Есть некоторые веские причины для eval, но их немного и далеко. – Jacco

+0

@Aiden: И если вы вызываете 'eval()' в цикле, который является геноцидом ангела! –

ответ

2

Я бы никогда не хотят вложенные eval(), и тем более не в каком-либо рекурсивном логика. Плохие новости. Вместо этого используйте PHP's Include. 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() and other output buffer controls

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

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

Я видел это на PHP Doc-пользовательские комментарии-штуковина, и кажется, как плохая идея:

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

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

+1

@stereofrog - функционально, может быть, но скорость? –

+1

@sterofrog, что ... file_get_contents() имеет накладные расходы ввода-вывода, только в другом месте. –