1

我快要哭了。我已经阅读了 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…<br> <div id="main-content"> {$tpl['page-content']} </div>

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

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

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

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

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

4

3 回答 3

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'],等等。

于 2010-01-11T05:44:36.220 回答
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"
于 2010-01-11T05:23:23.830 回答
0

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

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

而且 {$tpl[ \ 'title \ ']} 解析不好。

于 2010-01-11T05:25:04.487 回答