淺析PHP模板引擎

??Smarty模板是業(yè)內最知名的PHP模板引擎之一审残,它實現了前后端的分離先紫,使PHP程序員和前端程序員各行其事衩茸,方便了多人的分工合作骗绕。從這里我們可以看出藐窄,模板引擎集中解決了代碼和表現分離這件事情。但是酬土,實現項目開發(fā)過程中荆忍,絕大多數情況下都會使用一款框架,當然每個PHP框架也都實現了自己的模板引擎诺凡。雖然我沒有精讀過Smarty模板的源碼东揣,但是我對使用過的框架源碼還有一定的基礎,所以對模板引擎原理有一定的理解腹泌。

模板語法

每個模板引擎都有一套自己約束的標簽寫法和解析規(guī)則嘶卧,如:Smarty模板默認定界符是"{ }",ThinkPHP的默認定界符也是"{ }"凉袱,Laravel模板默認定界符是"{{ }}"芥吟,也有一些模板引擎使用"<{ }>"作為默認的定界符。

處理流程

simple process

核心方法

模板類的主要實現assigndisplay兩個基礎方法专甩。

    /**
     * 模板變量賦值
     * @access public
     * @param mixed $name  變量名
     * @param mixed $value 變量值
     * @return $this
     */
    public function assign($name, $value = '')
    {
        if (is_array($name)) {
            $this->data = array_merge($this->data, $name);
        } else {
            $this->data[$name] = $value;
        }
        return $this;
    }
    /**
     * 渲染模板文件
     * @access public
     * @param string    $template 模板文件
     * @param array     $data 模板變量
     * @return void
     */
    public function display($template, $data = [])
    {
        // 判斷模板文件是否存在
        if (!is_file($template)) 
        {
            exit('template not exists:' . $template);
        }
        $vars = array_merge($this->data, $data);

        /**此處約省略1000000字*/

        extract($vars, EXTR_OVERWRITE);
        include $template;
    }

模板解析類的主要實現parse方法

   /**
     * 模板解析
     * @access public
     * @param string $content 要解析的模板內容
     * @return true
     */
    public function parse(&$content)
    {
        $content = preg_replace($pattern, $replacement, $content);

        /**此處約省略1000000字*/

        return true; 
    }

整體過程

  • 請求從入口進來到達控制器钟鸵,實例化模板類,通過assign方法注入要展示的數據涤躲,通過display方法綁定要展示的模板棺耍。
  • 在模板類中引入相關配置,如:定界符种樱、模板路徑蒙袍、緩存類型、緩存路徑嫩挤、緩存時間害幅。實例化模板解析類,調起模板編譯方法岂昭。
  • 在模板解析類中以现,通過緩存類型、編譯文件、更新模板文件否邑遏、過期時間等等判斷決定佣赖,是否生成PHP+HTML的混合文件,如果需要生成无宿,就調起parse方法按約定的規(guī)則解析標簽內容茵汰,寫入編譯緩存文件枢里。
  • 最后孽鸡,分解[extract]模板變量,載入[include]緩存文件,顯示頁面數據栏豺。

由于我源出某派彬碱,不得不說某派的產品框架雖然有自己的模板引擎,并且號稱語法上基本忠于Smarty模板奥洼,但是最后一步絕對使用eval執(zhí)行編譯緩存文件巷疼,這與Smarty模板不同。并且在爾后的模板類中將assigndisplay升級成為一個page("template.html", $pagedata);方法灵奖,把參數注入改成由page方法的第二個參數實現嚼沿。而 Smarty模板最終實現方法如下:

loadCompiledTemplate

這里HHVM_VERSION常量全局沒有定義,所以它和其他框架一樣瓷患,默認使用include載入緩存文件骡尽。這里不得不噴一下SHOPXC的模板類,真是相當的丑陋和簡單擅编,連extract都不愿意使用使用攀细,導致最后在模板中每個模板變量都得使用$output['xxx']來接收。注:不是惡意評論SHOPXC產品爱态,只是這種做法實現別扭谭贪。

綜上所述: 實現一款簡易的PHP模板引擎除了良好的OOP基礎外,還需要掌握include, extract, is_file, file_exists, filemtime, file_get_contents, file_put_contents, preg_replace, str_replace, ob_start, ob_get_clean, eval, array_merge等方法的使用锦担,其中正則表達式尤為重要俭识。

--END--

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市洞渔,隨后出現的幾起案子套媚,更是在濱河造成了極大的恐慌,老刑警劉巖痘煤,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凑阶,死亡現場離奇詭異,居然都是意外死亡衷快,警方通過查閱死者的電腦和手機宙橱,發(fā)現死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人师郑,你說我怎么就攤上這事环葵。” “怎么了宝冕?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵张遭,是天一觀的道長。 經常有香客問我地梨,道長菊卷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任宝剖,我火速辦了婚禮洁闰,結果婚禮上,老公的妹妹穿的比我還像新娘万细。我一直安慰自己扑眉,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布赖钞。 她就那樣靜靜地躺著腰素,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雪营。 梳的紋絲不亂的頭發(fā)上弓千,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音卓缰,去河邊找鬼计呈。 笑死,一個胖子當著我的面吹牛征唬,可吹牛的內容都是我干的捌显。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼总寒,長吁一口氣:“原來是場噩夢啊……” “哼扶歪!你這毒婦竟也來了?” 一聲冷哼從身側響起摄闸,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤善镰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后年枕,有當地人在樹林里發(fā)現了一具尸體炫欺,經...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年熏兄,在試婚紗的時候發(fā)現自己被綠了品洛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片树姨。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖桥状,靈堂內的尸體忽然破棺而出帽揪,到底是詐尸還是另有隱情,我是刑警寧澤辅斟,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布转晰,位于F島的核電站,受9級特大地震影響士飒,放射性物質發(fā)生泄漏查邢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一变汪、第九天 我趴在偏房一處隱蔽的房頂上張望侠坎。 院中可真熱鬧蚁趁,春花似錦裙盾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钢属,卻和暖如春徘熔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淆党。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工酷师, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人染乌。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓山孔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親荷憋。 傳聞我的和親對象是個殘疾皇子台颠,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內容