模版引擎 smarty 怎样工作的 学习感悟 foreach

我没有仔细看smrty内部到底是怎么写的只是用了之后根据自己的想法,感觉是这样的,写点东西。当然只是针对foreach这一个函数,如果有错误希望您能提出来因为这会给我莫大的帮助!!

关于 smarty内部是如何解析这些代码的一直都是我的困惑,我想以这个为例:

  1. <{ foreach from = $arr1 item = temp }>
  2. <{ $temp }>
  3. <{/foreach }>

“<{ }>"是自己定义的分隔符号。(假使$arr1是一个简单的一位数组. )    这些都是模版文件tpl中的内容,这个foreach只是其中的一小段内容,我现在只分析foreach,因为其他内容我还没想太明白……觉得前人真是思 维很缜密,会想到将foreach中的两个值用from和item来标记…………

一、首先,提取文件流中所有标记符之间的数据,并存入一个数组:$arr中

2.循环遍历数组,并比对每一个字符串中是否包含foreach关键字或者其他关键字。比如:

$arr[0]=" foreach from = $arr1 item = temp "

$arr[1]=" $temp "

$arr[2]="/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){  ?>

二、继续遍历arr[1],

由于只有变量标识符$,我想即使是$temp变成比较语句、赋值语句,也应该直接输出,因为这些都将写入文件中,不需要得出结果,所以替换成:<?php echo "$temp"; ?>

前两句合起来就是:

  1. <?php foreach($arr1 as $temp){  ?>
  2. <?php echo "$temp"; ?>

三、继续遍历arr【2】

由于遇到了/foreach符号,所以输出:“}”符号,可是 当我们使用if elseif 以及else的时候,在碰到/if时应该输出几个“}”呢?我想在碰到elseif及else时要提前输出“}”来确保上一个符号被关闭。则,替换完成后,成为这样子:

  1. <?php foreach($arr1 as $temp){  ?>
  2. <?php echo "$temp"; ?>
  3. <?php } ?>

(去掉碍眼的php标记,就是:

  1. foreach($arr1 as $temp){
  2. echo "$temp";

这样就很清晰了。)

这样再将替换完成的流输出至文件…….php,并调用该文件。ok完了!!!!

原文地址:https://www.cnblogs.com/frankyang2014/p/2671501.html