我准备哭了。我已经阅读了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中显示为一个空白行。
我确信我还不知道该语言的某些方面。非常感谢任何帮助!!
答案 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']
等。