使用eval()的基本PHP模板的错误

时间:2010-01-11 05:11:32

标签: php templates eval task-parallel-library

我准备哭了。我已经阅读了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>
<meta name="description" content="{$tpl['description']}" />
nav, etc…
<div id="main-content"> {$tpl['page-content']} </div>

我喜欢整齐和干净的代码,没有一大堆额外的<?=…?>

首先,当大括号{}出现在字符串中时,会调用什么?如果我知道的话,我或许可以查阅并学习如何使用它们。

接下来,这根本不起作用。如果我从变量键中删除单引号,这很好,但是php.net说如果我的名字在某些时候成为语言常量,你就不应该这样做。很公平。但是我该如何解决这个问题呢?我喜欢在vars中使用数组,以防我想构建一个evalTemplate子例程,只需将$ tpl传递给它。

最后,$ tpl ['page-content']无法打印出来。变量设置好了;我可以使用echo $tpl['page-content']进行测试,但它在最终HTML中显示为一个空白行。

我确信我还不知道该语言的某些方面。非常感谢任何帮助!!

3 个答案:

答案 0 :(得分:0)

通常在字符串变量扩展中不使用''字符串分隔符。即"$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"

答案 1 :(得分:0)

addslashes()在字符串中的单引号和双引号之前添加斜杠。 为您的示例生成的代码将是

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

{$ tpl [ \ 'title \ ']}无法解析。

答案 2 :(得分:0)

正如沃尔克指出的那样,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']等。