我没有仔细看smrty内部究竟是怎么写的只是用了以后根据本身的想法,感受是这样的,写点东西。固然只是针对foreach这一个函数,若是有错误但愿您能提出来,由于这会给我莫大的帮助!!php
关于 smarty内部是如何解析这些代码的一直都是个人困惑,我想以这个为例:数组
“<{ }>"是本身定义的分隔符号。(假使$arr1是一个简单的一位数组. ) 这些都是模版文件tpl中的内容,这个foreach只是其中的一小段内容,我如今只分析foreach,由于其余内容我还没想太明白……以为前人真是思惟很缜密,会想到将foreach中的两个值用from和item来标记…………函数
1、首先,提取文件流中全部标记符之间的数据,并存入一个数组:$arr中spa
2.循环遍历数组,并比对每个字符串中是否包含foreach关键字或者其余关键字。好比:字符串
$arr[0]=" foreach from = $arr1 item = temp "it
$arr[1]=" $temp "变量
$arr[2]="/foreach"foreach
首先判断arr[0],包含foreach,则将$arr[0]中“from = ”后面可是“item”前的内容“$arr1”提取出来,存入数组str【0】,再将"item = "后的内容提取出来,存入str[1],而后将这些数组拼合成一个新的数组str,循环
则str="<?php foreach("+str[0]+"as $"+str[1]+"){ ?>",将该串替换$arr[0]所在字符流中的位置,即遍历
原内容变成:<?php foreach($arr1 as $temp){ ?>
2、继续遍历arr[1],
因为只有变量标识符$,我想即便是$temp变成比较语句、赋值语句,也应该直接输出,由于这些都将写入文件中,不须要得出结果,因此替换成:<?php echo "$temp"; ?>
前两句合起来就是:
3、继续遍历arr【2】
因为遇到了/foreach符号,因此输出:“}”符号,但是 当咱们使用if elseif 以及else的时候,在碰到/if时应该输出几个“}”呢?我想在碰到elseif及else时要提早输出“}”来确保上一个符号被关闭。则,替换完成后,成为这样子:
(去掉碍眼的php标记,就是:
这样就很清晰了。)
这样再将替换完成的流输出至文件…….php,并调用该文件。ok完了!!!!