Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用eval()的基本PHP模板出现错误_Php_Templates_Eval_Task Parallel Library - Fatal编程技术网

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

使用eval()的基本PHP模板出现错误,php,templates,eval,task-parallel-library,Php,Templates,Eval,Task Parallel Library,我几乎要哭了。我阅读了php.net手册页面,尝试了十几次使用各种短语的谷歌搜索,并扫描了数百个stackoverflow线程。我见过这种方法在使用中,但它对我不起作用。这似乎很基本。我有一些相关的问题,我不知道如何找到答案 PHP文件的重要部分如下所示: switch() { …other cases… default: $tpl['title'] = "Newsletter Signup"; $tpl['description'] = "Newsletter description"

我几乎要哭了。我阅读了php.net手册页面,尝试了十几次使用各种短语的谷歌搜索,并扫描了数百个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;
My index.tpl文件包括以下行:

{$tpl['title']}

导航等…
{$tpl['page-content']}

我喜欢代码整洁干净,没有一大堆额外的

首先,当花括号{}出现在字符串中时,它叫什么?如果我知道的话,我也许能查到它并学会如何使用它们

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

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

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

通常在字符串变量展开中不使用“”字符串分隔符。即,
“$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"
addslashes()在字符串中的单引号和双引号之前添加斜杠。 为您的示例生成的代码如下

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

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

正如沃尔克指出的,
addslashes
似乎是个问题。请尝试添加cslashes。此外,我强烈建议将其作为一个函数,以简化清理/解析:

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);

注:上面使用的
extract
意味着您的VAR只是
$title
,而不是
$tpl['title']
,等等。

这没有什么意义:
eval(\$html=\$tpl\u src\”)。您只需省略
eval
和所有复杂的引用和转义。这样做:
$html=$tpl\u src
它的计算结果完全相同。@Asaph-不起作用,因为
eval
是强制插值加载对象所必需的string@K首要的哦,我明白了。无聊的。我发现
eval
的这种用法(以及大多数用法)在风格上没有吸引力……非常感谢大括号信息!我喜欢这个答案,因为它完美地解决了我遇到的每一个问题,并在我的词汇表中添加了“摘录”和“添加睫毛”!非常感谢!