我有这段代码:
$layout_template = template_get("Layout");
$output_template = template_get("Homepage");
$box = box("Test","Test","Test");
eval("\$output = \"$layout_template\";");
echo $output;
在$ template_layout变量中调用了 变量$ output_template,然后脚本移动到$ output_template变量
但它没有进一步,$ output_template内部是对变量$ box的调用,但它不会超过一个级别
答案 0 :(得分:2)
我从不想要嵌套eval()
,尤其不要在任何递归逻辑中。坏消息。请改用PHP's Include。 IIRC eval()
创建一个新的执行上下文,但是include()
没有。{/ p>
如果您有缓冲区,例如:
<h1><?php echo $myCMS['title']; ?></h1>
我有时会像上面这样的Index.tpl
这样的文件访问像这样的关联数组,那么你只需要在你的班级中进行:
<?php
class TemplateEngine {
...
public function setvar($name, $val)
{
$this->varTable[$name]=make_safe($val);
}
....
/* Get contents of file through include() into a variable */
public function render( $moreVars )
{
flush();
ob_start();
include('file.php');
$contents = ob_get_clean();
/* $contents contains an eval()-like processed string */
...
结帐ob_start() and other output buffer controls
如果您使用eval()
或任何用户数据包含,请务必清理错误代码的输入。
看起来您正在编写某种组合的小部件/模板系统。将您的小部件(视图)编写为类,并允许在现有的模板系统中使用。保持通用$myWidget->render($model)
等等。
我在PHP doc-user-comments-thingy上看到了这一点,这似乎是一个坏主意:
<?php
$var = 'dynamic content';
echo eval('?>' . file_get_contents('template.phtml') . '<?');
?>
也许有人可以在那个问题上给我启发:P