如何制作一个 PHP 模板引擎?

8

我需要制作一个小而简单的PHP模板引擎,我搜索了很多,但很多都太复杂难以理解,我不想使用Smarty和其他类似的引擎。我从Stack Overflow上得到了一些灵感,像这样:

$template = file_get_contents('file.html');
$array = array('var1' => 'value',
                'txt' => 'text');

foreach($array as $key => $value)
{
  $template = str_replace('{'.$key.'}', $value, $template);
}

echo $template;

现在,我不想使用 echo 来输出模板,而是想要添加 include "file.html",它将显示具有正确变量值的文件,并且我想将引擎放在一个单独的位置,只需在需要用到它的模板中包含它。像 phpbb 那样,在声明数组时使用它,最后包含 html 文件。抱歉我要求太多了,但有人可以解释一下这背后的基本概念吗?
编辑:好吧,让我坦白些,我正在制作一个论坛脚本,我有很多想法,但我希望将其模板系统做成像 phpbb 一样的单独模板引擎。如果您能提供帮助,请加入我。抱歉打广告.. :p

为什么你不想使用Smarty?你的方法相比其他模板引擎有哪些优势? - mdm
为什么要重复造轮子呢?如果只是因为你不想花时间学习Smarty,那么我认为你正在犯一个错误。长远来看,它会节省你的时间,因为Smarty开发人员已经解决了你在尝试创建自己的引擎时遇到的所有问题。 - 3urdoch
15
PHP已经是一个模板引擎,Smarty的存在相当于重新发明轮子。 - Capsule
1
PHP 已经是一个模板引擎。从非常严格的意义上讲,这是真的,但在某些情况下,它非常冗长和缺乏灵活性。 - Dissident Rage
4个回答

13

file.html:

->

文件名为file.html:

<html>

<body>
<h3>Hi there, <?php echo $name ?></h3>
</body>

</html>

file.php:

<?php
    $name = "Keshav";
    include('file.html');
?>

这再简单不过了。是的,它使用了全局变量,但如果简单是目标的话,这就是答案。只需访问'http://example.com/file.php',然后就可以开始了。

现在,如果你想让用户在浏览器地址栏中看到'file.html',你需要配置你的Web服务器将.html文件视为PHP脚本,这有点复杂,但是肯定可行。一旦完成,你可以将两个文件合并成一个:

file.html:

<?php
    $name = "Keshav";
?>
<html>

<body>
<h3>Hi there, <?php echo $name ?></h3>
</body>

</html>

2
如果可以的话,我会给予+100分,没有必要重新发明轮子。PHP代表PHP超文本预处理器,“超文本”不是无意义的存在... - Capsule
您是否需要一个模板引擎来使您的模板可模板化? - Marc B
2
百分之百肯定。PHP是一个模板引擎。启用短标签后,它也是一个不错的模板引擎。 - user229044
我知道,但我只是想让事情保持分开,PHP 部分交给 PHP 开发人员处理,HTML 部分交给 HTML 开发人员处理,并且在需要时更换主题非常容易。 - Keshav Nair

9

如果想要一个更易于维护的脚本,那么将其转换为函数会是一个不错的选择。

就像这样:

<?php

function get_content($file, $data)
{
   $template = file_get_contents($file);

   foreach($data as $key => $value)
   {
     $template = str_replace('{'.$key.'}', $value, $template);
   }

   return $template;
}

你可以这样使用它:

<?php

$file = '/path/to/your/file.php';
$data = = array('var1' => 'value',
                'txt' => 'text');

echo get_content($file, $data);

3
一旦你解决了所有的错误,修复了你所遇到的性能问题,你最终会得到一个类似于Smarty和其他模板引擎的模板引擎。
这种查找替换的方法比编译成PHP要慢得多。它不能很好地处理转义(你会遇到XSS问题)。添加条件和循环将非常困难,而你迟早会需要它们。

在编写自己的代码时需要付出一些努力,然而它带来了许多重要的好处:你可以了解它是如何工作的(可能是最重要的);你可以自己修复程序中的错误;通常只有必要的功能,非常轻量级;不会依赖于第三方软件包(也就不会产生安全问题)。因此,使用自己编写的代码有很多优点。 - Hop hop

2
    <?php
    class view {
        private $file;
        private $vars = array();

        public function __construct($file) {
            $this->file = $file;
        }

        public function __set($key, $val) {
            $this->vars[$key] = $val;
        }

        public function __get($key, $val) {
            return (isset($this->vars[$key])) ? $this->vars[$key] : null;
        }

        public function render() {
            //start output buffering (so we can return the content)
            ob_start();
            //bring all variables into "local" variables using "variable variable names"
            foreach($this->vars as $k => $v) {
                $$k = $v;
            }

            //include view
            include($this->file);

            $str = ob_get_contents();//get teh entire view.
            ob_end_clean();//stop output buffering
            return $str;
        }
    }

以下是如何使用它的步骤:
    <?php
    $view = new view('userprofile.php');
    $view->name = 'Afflicto';
    $view->bio = "I'm a geek.";
    echo $view->render();

你需要给予应有的信用!! http://www.sitepoint.com/flexible-view-manipulation-1/ - goodMan
因为 OOP 不必要,我给了 -1 分。但是由于缓冲区的使用,我又给了 +1 分。所以我的评分是 0 分。 - Hop hop

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