我沒有仔細看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完了!!!!