基本模板引擎修复

时间:2013-05-08 03:54:36

标签: php

我正在尝试为php创建一个(非常)基本的模板引擎。根据我的研究,我发现我使用的方法非常不受欢迎。我想知道是否有人知道一个很好的选择,以获得相同的结果,所以我没有使用它。如果有人看到任何其他改进,请分享!

未建议的方法是eval()方法!

这是php文件

<?php

class Engine {
    private $vars = array();

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

public function render($file_name) {
    $path = $file_name . '.html';

    if (file_exists($path)) {

        $content = file_get_contents($path);

        foreach ($this->vars as $key => $value) {
            $content = preg_replace('/\{' . $key . '\}/', $value, $content);
        }

        eval(' ?>' . $content . '<?php ');

    } else {
        exit('<h4>Engine Error</h4>');
    }
  }
}

?>

这是index.php文件

<?php

include_once 'engine.php';

$engine = new Engine;

$engine->assign('username', 'Zach');
$engine->assign('age', 21);

$engine->render('test');

?>

这里只是一个测试html文件来显示其基本功能

My name is {username} and I am {age} years old!

输出:

My name is Zach and I am 21 years old!

非常感谢提前!

1 个答案:

答案 0 :(得分:-1)

如果您只想输出一些文字到页面,请使用echo

echo $content;

这比eval('?>' . $content . '<?php')好,原因有很多:例如,如果某人在<?php phpinfo(); ?>中输入了他们的用户名,就不会执行该代码。

但是,我会注意到你还有其他一些问题。如果我这样做怎么办?

$engine = new Engine;

$engine->assign('username', '{age}');
$engine->assign('age', 21);

$engine->render('test');

{age}值中的username将替换为21。通常你不希望像那样替换替换,特别是因为它依赖于顺序(如果你以后分配了username,它就不会发生。)