Я бы никогда не хотят вложенные 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
Каждый раз, когда вы звоните Eval() ангел умирает. –
Как правило, вы НЕ используете eval(); Есть некоторые веские причины для eval, но их немного и далеко. – Jacco
@Aiden: И если вы вызываете 'eval()' в цикле, который является геноцидом ангела! –