【发布时间】:2010-08-12 23:25:44
【问题描述】:
我一直在编写 MVC 风格的 CMS,并使用模板类通过 file_get_contents 提取所需的各种文件
最后我做到了
eval('?>'.($template).'<?');
知道 eval 是邪恶的,我该如何选择刷新这些数据以便 PHP 实际呈现代码?
目前,一旦所有内容都已加载,模板类就会执行此操作。 Template 类是否可以将此代码作为变量返回到我的 index.php 中,然后运行一些东西以使其执行?
我遇到的每个编写 MVC 样式网站的示例都使用 eval 来解决问题。
另一个相关问题 - 我知道 eval 可用于运行恶意用户输入的代码,但其他一些函数不会遭受同样的命运吗?如果我将任何用户内容转换为 html 实体,这不会克服这个问题吗?
很可能我的方法有缺陷,但它遵循我一直在阅读的示例,这就是为什么我渴望看到另一种避免 eval 的方法。
我刚刚发现这个 sn-p 实现了同样的事情:
function interpolate( $string ){
foreach ($GLOBALS as $name => $value){
$string = str_replace( '$'.$name, $value, $string );
}
$string = preg_replace( '/[$]\\w+/', '', $string );
return $string;
}
这通过将变量替换为正确的内容来有效地呈现所有代码。
【问题讨论】:
-
也许你的设计有缺陷。如果您简洁地解释您要解决的问题,那么也许可以通过更改来避免 eval。
-
我同意 James 的观点,不仅不清楚你在做什么,还不清楚你为什么这样做。
-
您可能对这里的一些对话感兴趣 - stackoverflow.com/questions/3326446/…