模版引擎 smarty 怎樣工做的 學習感悟 foreach

我沒有仔細看smrty內部究竟是怎麼寫的只是用了以後根據本身的想法,感受是這樣的,寫點東西。固然只是針對foreach這一個函數,若是有錯誤但願您能提出來由於這會給我莫大的幫助!!php

關於 smarty內部是如何解析這些代碼的一直都是個人困惑,我想以這個爲例:數組

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

「<{ }>"是本身定義的分隔符號。(假使$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"; ?>

前兩句合起來就是:

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

3、繼續遍歷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完了!!!!

相關文章
相關標籤/搜索