W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
理念
Smarty的設(shè)計主要由這些理念的驅(qū)動:
干凈地分離顯示邏輯和程序代碼
PHP后端,Smarty模板前端
增強PHP, 而不是取代它
程序員和設(shè)計師的快速開發(fā)/部署
快速和簡單的維護
語法簡單易懂,無須懂PHP
靈活的自定義開發(fā)
安全: 隔離于PHP
免費, 開源
Smarty是什么?
Smarty是一個PHP的模板引擎,提供讓程序邏輯與頁面顯示(HTML/CSS)代碼分離的功能。 也就是PHP代碼是程序邏輯,與頁面顯示分開。
兩種觀點
當PHP出現(xiàn)了模板引擎時,就有了兩種觀點: 第一種觀點是:“PHP本身就是模板引擎”。主張在HTML中內(nèi)使用簡單的PHP代碼。 雖然從純代碼運行觀點來看,這種主張是速度最快的,但有很大的爭議就是內(nèi)嵌的PHP代碼會 使得HTML凌亂并且非常復(fù)雜。
另一種觀點是頁面顯示應(yīng)該是沒有程序代碼的,轉(zhuǎn)而用簡單的標簽來顯示內(nèi)容。 這中主張在別的模板引擎(甚至是其他編程語言)是很常見的,而且也是Smarty的觀點。 這種方式可以讓模板只專注于頁面顯示,避免混合了程序邏輯代碼,更方便管理。
PHP與模板分離的重要性
兩個主要是好處:
語法:模板語法通常是更符合HTML標記的語義。PHP語法可以在程序代碼中運作的很好, 但如何混合在HTML中就不然。Smarty簡單的{標簽}語法是為了表達顯示邏輯而設(shè)計的。 Smarty讓你的模板更專注于頁面顯示,而不用關(guān)注太多“代碼”。 這可以讓模板開發(fā)得更快速,維護更容易。 學習Smarty的語法不需要懂得PHP的相關(guān)知識,程序員或非程序員都能很快上手。
松耦合:當PHP代碼混合在模板中,那將無法約束任意的邏輯代碼被寫到模板上。 Smarty分隔了模板和PHP,控制了頁面顯示和業(yè)務(wù)邏輯的分離。 Smarty還有安全特性,可以令模板源碼有強制的約束。
頁面設(shè)計者和PHP
一個通常的問題是:“頁面設(shè)計者既然要學一門語法,為什么不學PHP?”。當然頁面設(shè)計者可以 學習PHP,而且他們可能已經(jīng)非常熟悉PHP。問題并非是他們是否有能力學習PHP,問題在于HTML混合PHP的情況,如果設(shè)計者使用PHP,那么就很容易會將一些不屬于模板的PHP代碼寫到模板上。 (正如當他們只需要一把小刀但你塞給他們一把瑞士軍刀一樣)。 你可以教導他們程序設(shè)計的規(guī)則,但這可能是他們不真正需要學習的事情(他們不是開發(fā)者)。 而且PHP手冊也是非常繁多難以篩選出你需要的部分進行教導, 就像你給了車子的買主一本汽車工廠里面的裝配手冊,而不是汽車的操作手冊一樣。 Smarty恰到好處地給予了設(shè)計者需要的工具,而提供了開發(fā)者更好地控制這些工具的方法。 這種簡單的標簽語法也是非常受到設(shè)計者的歡迎,幫助了設(shè)計者流水式地組織管理模板。
實踐很重要
雖然Smarty提供了讓你清晰分離顯示邏輯和程序代碼的工具,但也留下了不少空間可違反這些規(guī)則。一個失敗的實踐(如將純PHP代碼寫到模板中)將導致比顯示邏輯分離更多的問題。本手冊可以很好地告訴你哪些事情需要關(guān)注的。同時也可以參考Smarty網(wǎng)站上最佳實踐的文章。
Smarty是怎么工作的?
在底層,Smarty“編譯”(簡單地復(fù)制和轉(zhuǎn)換)模板為PHP代碼。這在每個模板第一次調(diào)用時發(fā)生,然后編譯后的代碼將被一直使用。Smarty處理地非常的好,所以模板設(shè)計師僅編輯模板而不需要關(guān)注編譯的事情。這方法保持了模板的易維護,同時也保證了運行時是PHP代碼的方式運行,這樣PHP代碼就可以通過類似APC等OP-CODE緩存器來加速了。
模板繼承
模板繼承是Smarty 3的新特性。在模板繼承出現(xiàn)之前,我們將模板分為多片,如header和footer等模板。這種在每個模板內(nèi)都引入header/footer的組織方式會導致許多問題,如遞歸跳轉(zhuǎn)等。模板繼承,就像維護單獨的模板一樣簡單。我們可以設(shè)置一些內(nèi)容塊來進行繼承,這樣更直觀、有效和容易被管理。更多詳情請參考模板繼承的章節(jié)。
為什么不使用 XML/XSLT 語法?
有許多好的理由。首先,Smarty不僅可以用在XML/HTML模板中,還可以做更多,如生成電郵、javascript、CSV和PDF文檔等。 其次,XML/XSLT語法比起PHP代碼還要更冗長和脆弱!它適合給計算機看,但對人類非常不友好。 Smarty是希望模板能非常容易閱讀、理解和維護的。
模板安全
雖然Smarty已經(jīng)隔離了PHP代碼,但如果你愿意,你還可以有相當多的方法來使用它。 模板安全機制提供了嚴格的隔離方式。在你將模板給第三方進行編輯,但又不希望他們使用全部的PHP功能時, 模板安全機制非常地有用。
整合
有時人們會把Smarty和一些MVC框架進行對比(Model-View-Controller 模型-視圖-控制器)。 Smarty并非一個MVC,它僅是顯示層,就是MVC中的V層(視圖層)。 從這方面而言,Smarty可以很容易被整合到MVC中作為視圖層。 許多非常著名的框架都整合了Smarty作為視圖層,你可以在論壇或者文檔中找到一些相關(guān)的內(nèi)容。
其他的模板引擎
Smarty并非唯一的,遵循"分離顯示邏輯和程序代碼"的引擎。 舉個例子,Python有這相同理念的模板引擎,如 Django Templates 和 CheetahTemplate等。 說明: Python這種語言天生是不那么容易混雜在HTML中,因為其設(shè)計思路就是希望程序代碼獨立在顯示之外的。 當然,也有一些Python庫可以讓Python混合到HTML中,但一般是不推薦的。
Smarty不是什么
Smarty不是一個應(yīng)用開發(fā)框架。Smarty不是一個MVC。Smarty不像Zend Framework, CodeIgniter, PHPCake, 或者其他的PHP應(yīng)用開發(fā)框架。
Smarty是一個模板引擎,在應(yīng)用程序中,當作V層(視圖層)的組件來使用。 Smarty可以很輕易連接到其他的視圖引擎中。 和其他的軟件技術(shù)一樣,Smarty也有著學習曲線。 Smarty不一定保證良好的程序設(shè)計或者達成顯示分離的目的,這還得需要開發(fā)者和模板設(shè)計師的努力。
Smarty適合我嗎?
Smarty并非一個可以做任何事情的工具。重要的是如何去判斷Smarty是否符合你的需要,下面是一些建議:
模板語法。 你的模板內(nèi)容是否PHP代碼和HTML的混合體? 你的模板設(shè)計師是否也適應(yīng)用PHP開發(fā)? 你的模板設(shè)計師是否希望有一套標記型的語法來設(shè)計顯示內(nèi)容? 通過使用Smarty和PHP的經(jīng)驗可以回答這些問題。
業(yè)務(wù)狀況。 是否有將模板和PHP代碼分離的需求? 你是否有非可信的第三方來編輯模板,但你又不希望他們可以使用全部PHP的功能? 你是否需要通過程序控制哪些功能在模板是可用、和不可用? Smarty的設(shè)計可以滿足以上的功能。
強大特性。 比起自行開發(fā),Smarty的特性如緩存、模板繼承和插件機制,是否更能節(jié)省開發(fā)時間? 你計劃使用的基礎(chǔ)庫或者框架是否需要這樣的顯示組件?
PHP模板是個熱門的話題,也存在很多意見的分歧。 重要的是你弄清楚Smarty,弄情況你的需求,來做一個適合你的選擇。 歡迎在論壇或者IRC頻道中提出問題討論。
參見Smarty網(wǎng)站的“用例及工作流”章節(jié)。
使用Smarty的站點
每天都有成千上萬的獨立訪客訪問Smarty網(wǎng)站,大多數(shù)都是開發(fā)者在閱讀手冊。許多著名的PHP項目在使用Smarty,如XOOPS CMS, CMS Made Simple , Tiki CMS/Groupware 和 X-Cart 等等。
總結(jié)
無論你使用Smarty來制作一個小網(wǎng)站,或者是大型的商業(yè)系統(tǒng),它都能很好地適合你的需要。 這里是一些選擇Smarty的優(yōu)勢:
分離PHP代碼和HTML/CSS顯示
良好的組織和管理
第三方模板訪問安全機制
全功能,易于擴展
眾多用戶使用,Smarty一直在發(fā)展
LGPL 許可,可商業(yè)使用
100% 免費, 開源的項目
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: