我正在尝试创建自己的模板引擎,(不要问为什么!)
并会尝试制作:
{{@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')”。我做错了什么?
答案 0 :(得分:0)
尽管已经有 uber 相关评论反对构建一个新的模板引擎,但我建议打破找到的字符串。以{{@Form::input("name")}}
为例,您需要{{@ CLASS_NAME :: FUNCTION_NAME ( params )}}。因此,使用正则表达式可以打破找到的字符串(就像你已经做的那样),创建一个实例或引用检测到的类,然后调用使用动态调用解析的方法(如果找不到任何一个,显然会失败/错误)。
对于参数,您可以避免限定符(在本例中为引号)并在每个逗号上中断,或者使用限定符并再次通过regex以不同方式对其进行解析。你的来电。对于解析和找到的每个参数,它们将被添加到函数调用中。为了避免eval
,并且鉴于PHP不支持随机数量的参数(例如Python与args
和kwargs
一起使用),将数组作为单个参数您将在模板文件中使用的功能。
您还可以使用某种“接口”函数接受一定数量的参数,然后接收函数(或类+函数名称),计算它找到的参数数量,最后将调用转发给实际的底层函数功能基于找到的正确参数数量。虽然你添加的越多,处理变得越模糊 - 假设模板引擎的用户将能够定义新的模板方法,使用第二条路径是一个非常糟糕的主意(因为你必须支持这些接口函数上的N 参数。)