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