我正在尝试为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!
非常感谢提前!
答案 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
,它就不会发生。)