你如何通过多个级别评估()PHP代码?

时间:2010-01-30 11:49:08

标签: php eval

我有这段代码:

$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的调用,但它不会超过一个级别

1 个答案:

答案 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