Ошибки с базовым шаблоном PHP с использованием eval () - PullRequest
1 голос
/ 11 января 2010

Я почти готова плакать. Я прочитал справочную страницу php.net, попробовал десятки поисковых запросов в Google с различными фразами и отсканировал сотни потоков stackoverflow. Я видел этот метод в использовании, но он просто не работает для меня. Это кажется таким простым. У меня есть пара вопросов или проблем, на которые я не знаю, как найти ответы.

Важная часть файла PHP выглядит следующим образом:

switch() {
…other cases…
default:
  $tpl['title'] = "Newsletter Signup";
  $tpl['description'] = "Newsletter description";
  $tpl['page-content'] = file_get_contents('signup.html');
}

$tpl_src = addslashes(file_get_contents('index.tpl'));
eval("\$html = \"$tpl_src\";");
echo $html;

Мой файл index.tpl содержит такие строки:

<title>{$tpl['title']}</title><br> <meta name="description" content="{$tpl['description']}" /><br> nav, etc…<br> <div id="main-content"> {$tpl['page-content']} </div>

Мне нравится, насколько аккуратен и понятен код, без целой связки дополнительных <?=…?>.

Во-первых, когда в строке появляются фигурные скобки {}, как это называется? Я мог бы найти его и научиться пользоваться им, если бы знал.

Далее, это просто не работает вообще. Если я удаляю одинарные кавычки из ключей переменных, это хорошо, но php.net говорит, что вы никогда не должны этого делать, если мое имя в какой-то момент станет константой языка. Справедливо. Но как мне это исправить? Мне нравится использовать массив для vars, если я хочу создать подпрограмму evalTemplate и могу просто передать ей $ tpl.

Наконец, $ tpl ['page-content'] не распечатывается. Переменная установлена ​​в порядке; Я могу использовать echo $tpl['page-content'] для проверки, но в конечном HTML-коде он отображается как одна пустая строка.

Я уверен, что есть только один аспект языка, который я еще не знаю. Любая помощь высоко ценится!

Ответы [ 3 ]

0 голосов
/ 11 января 2010

addlashes () добавляет косую черту перед одинарными и двойными кавычками в строке. Код, сгенерированный для вашего примера, будет

$html = "<title>{$tpl[\'title\']}</title>
<meta name=\"description\" content=\"{$tpl[\'description\']}\" />
nav, etc…¦
<div id=\"main-content\"> {$tpl[\'page-content\']} </div>";

И {$ tpl [ \ 'title \ ']} плохо разбирается.

0 голосов
/ 11 января 2010

Как указал Волкер, addslashes кажется проблемой. Попробуйте addcslashes вместо этого. Кроме того, я бы настоятельно рекомендовал сделать это функцией, чтобы упростить очистку / анализ:

function render ($file, $vars)
{
    // .. extra sanitisation, validation, et al.
    $_html = '';
    $_raw_file = addcslashes (file_get_contents ($file), '"\\');
    extract ($vars, EXTR_SKIP);
    eval ('$_html = "'.$_raw_file.'"');

    return $_html;
}

И называется так:

switch() {
// …other cases…
default:
  $tpl['title'] = "Newsletter Signup";
  $tpl['description'] = "Newsletter description";
  $tpl['page-content'] = render ('signup.html');
}

echo render ('index.tpl', $tpl);

PS: использование extract выше означает, что ваши переменные будут просто $title, а не $tpl['title'] и т. Д.

0 голосов
/ 11 января 2010

Обычно вы не используете разделители строк в раскрытии строковых переменных. То есть "$tpl[content]" вместо "$tpl['content']".

Что касается фигурных скобок, они разделяют переменные, когда символы идентификатора могут идти прямо перед или после имени. Например:

$item = "Cup";
$text = "I smashed four $items"; // won't work
$text = "I smashed four {$item}s"; // will work.

// 2nd output: "I smashed four Cups"
...