Eval代码不起作用

时间:2013-08-09 13:08:36

标签: php

我正在尝试创建自己的模板引擎,(不要问为什么!)

并会尝试制作:

{{@Form::input("name")}}

在我的渲染系统中,我将制作此评估代码:

    preg_match_all('/\{\{\@(.*?)\}\}/is',$data,$output);

    $out="";

    foreach ( $output[1] as $variables):
        $find = '{{@' . $variables . '}}';

        $data = str_replace($find, eval($variables), $data);
    endforeach;

但是我收到了这个错误

 Parse error: syntax error, unexpected $end in /home/psafari/public_html/slt/classes/template.class.php(43) : eval()'d code on line 1

它应该在模板引擎中运行“Form :: input('something')”。我做错了什么?

1 个答案:

答案 0 :(得分:0)

尽管已经有 uber 相关评论反对构建一个新的模板引擎,但我建议打破找到的字符串。以{{@Form::input("name")}}为例,您需要{{@ CLASS_NAME :: FUNCTION_NAME params )}}。因此,使用正则表达式可以打破找到的字符串(就像你已经做的那样),创建一个实例或引用检测到的类,然后调用使用动态调用解析的方法(如果找不到任何一个,显然会失败/错误)。

对于参数,您可以避免限定符(在本例中为引号)并在每个逗号上中断,或者使用限定符并再次通过regex以不同方式对其进行解析。你的来电。对于解析和找到的每个参数,它们将被添加到函数调用中。为了避免eval,并且鉴于PHP不支持随机数量的参数(例如Python与argskwargs一起使用),将数组作为单个参数您将在模板文件中使用的功能。

您还可以使用某种“接口”函数接受一定数量的参数,然后接收函数(或类+函数名称),计算它找到的参数数量,最后将调用转发给实际的底层函数功能基于找到的正确参数数量。虽然你添加的越多,处理变得越模糊 - 假设模板引擎的用户将能够定义新的模板方法,使用第二条路径是一个非常糟糕的主意(因为你必须支持这些接口函数上的N 参数。)