0

我正在尝试为 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!

提前谢谢了!

4

1 回答 1

-1

如果您只想将一些文本输出到页面,只需使用echo

echo $content;

这比eval('?>' . $content . '<?php')有几个原因要好:其中一个原因是,如果有人输入<?php phpinfo(); ?>,例如,作为他们的用户名,它将不会执行该代码。

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

$engine = new Engine;

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

$engine->render('test');

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

于 2013-05-08T04:20:43.067 回答