具有变量的PHP模板类?

6

我希望能够让我的新项目开发变得更加容易,因此我需要一个非常简单的模板引擎解决方案。我在网上搜索了一圈,但要么太过臃肿,要么让我感到不适。

我的HTML文件将会是这样的:

<html>
    <head>
        <title>{PAGE_TITLE}</title>
    </head>
    <body>
        <h1>{PAGE_HEADER}</h1>
        <p>Some random content that is likely not to be parsed with PHP.</p>
    </body>
</html>

显然,我想用PHP设置的东西来替换{PAGE_TITLE}{PAGE_HEADER}。就像这样:
<?php

    $pageElements = array(
                            '{PAGE_TITLE}' => 'Some random title.',
                            '{PAGE_HEADER}' => 'A page header!'
                         );

?>

我会使用诸如 str_replace 的函数来替换HTML标签,并将替换后的HTML加载到字符串中,最后在页面上打印输出。目前我正在努力实现这个过程...请问有什么建议或者更好的方法吗?

谢谢。


1
“Makes me cringe” 让我觉得你根本不理解它们,也没有真正有兴趣去努力理解。实际上,没有必要重新发明这个特定的轮子。使用Smarty或Twig或类似的东西即可。 - cletus
1
我的意思是他们解析HTML文件并替换变量的方式,我就是不喜欢它。Smarty对于我想要的东西来说太过臃肿了。 - Joe
5个回答

6
您当前的策略是可行的,并且非常简单明了。使用 str_replace() 函数是高效而干净的,您可以简单地循环使用它来替换精确匹配的标记与变量内容。然而,缺点是您必须先将所有模板加载到字符串中,这可能相当低效。
另一种非常相似的备选方法是,您可以直接使用 extract() 函数。 extract() 函数将一组键值对作为参数,在本地范围内创建变量。如果您在同一范围内使用 include() 函数引入模板,则变量将已准备就绪。
例如:
function loadTemplate($template,$vars)
{
    extract($vars);
    include($template);
}

您的模板可以是常规的PHP格式。

<html>
    <head>
        <title><?php echo $PAGE_TITLE ?></title>
    </head>
    <body>
        <h1><?php echo $PAGE_HEADER ?></h1>
        <p>Some random content that is likely not to be parsed with PHP.</p>
    </body>
</html>

(显然,您可以使用短标签来减少模板冗长,但出于兼容性原因,我更喜欢不这样做。)
然后你所需要做的就是:
$pageElements = array(
                        'PAGE_TITLE' => 'Some random title.',
                        'PAGE_HEADER' => 'A page header!'
                     );
loadTemplate('file.phtml',$pageElements);

5

您可能对mustache.php感兴趣。它是一个非常轻量级的PHP类实现,基于Mustache

以下是从README中摘取的快速示例:

<?php
    include('Mustache.php');
    $m = new Mustache;
    echo $m->render('Hello {{planet}}', array('planet' => 'World!'));
    // "Hello World!"
?>

这是一个更深入的例子——这是典型的Mustache模板:

Hello {{name}}
You have just won ${{value}}!
{{#in_ca}}
Well, ${{taxed_value}}, after taxes.
{{/in_ca}}

2

如果要真的简单,PHP本身就是一个模板引擎,只需使用include()即可。

file.phtml:

<html>
    <head>
        <title><?=$tpl['PAGE_TITLE']?></title>
    </head>
    <body>
        <h1><?=$tpl['PAGE_HEADER']?></h1>
        <p>Some random content that is likely not to be parsed with PHP.</p>
    </body>
</html>

code.php:

tpl = Array 
(
'PAGE_HEADER' => "This is the lazy way to do it",
'PAGE_TITLE' => "I don't care because i am doing it this way anyways"
)
include("file.phtml")

这基本上就是我的做法。没必要把事情搞得太复杂,对吧? - Syntax Error
除非你的file.phtml文件中的HTML被放在一个变量里并且你使用echo输出,否则这是行不通的。仅仅在包含的HTML文件中加入花括号并不能使其被PHP解析。也许你想要用<?或<?php然后再使用echo或=。 - Pere
1
@Pere,您说得完全正确。就像代码一样,查看旧的SO帖子非常有趣。已经修复了。 - Byron Whitlock

0
function parseVars($vars, $file){

    $file = file_get_contents($file);
    foreach($vars as $key => $val){
        str_replace("{".$key."}", $val, $file);
    }

    echo $file;

}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接