2011-02-03 98 views
2

Smarty 3及其新詞法分析器令人興奮不已,而作爲模板設計人員可以爲您提供多大的權力,但是當它實際上碰到貨架時,它是真是令人失望,它有多慢。從頭開始編寫模板在Smarty 3中花費了一秒多,而Smarty 2中的相同模板花費了大約半秒。不好。基於XML的模板引擎與Smarty詞法分析器

但它確實讓我想到,爲什麼當PHP中已經有DOMDocument,SimpleXML等模塊可用時,需要在PHP中實現全面的語言解析器?

是否有PHP的基於XML擴展和/或DOMDocument的模板引擎?如果是這樣,那麼表現如何?如果沒有,那麼有沒有人試圖寫一個?

我可以預見的一個缺點是它只會對基於XML的格式(如XHTML和RSS)非常有用。爲了生成其他輸出(非XML HTML,純文本,CSS等),它可能會有相當大的問題,但我相信你可以用CDATA塊來繞過它。使用XML/DOM進行模板解析還有什麼其他含義,我還沒有考慮過?

回答

3

關於Smarty的問題,IIRC Smarty使用「編譯模板」,所以如果你提到的性能問題只在「編譯階段」纔會成爲一個爭議點 - 每個模板只編譯一次,此後模板內容是從(快得多)緩存輸出。

使用XML解析器的問題在於,HTML並不總是格式良好的XML。即使你使用有效的XHTML,你也可以跳過箍環來支持HTML實體,然後你會發現像嵌入式JavaScript等角落案例。(在一個側面說明,IMO這是HTML5的最大的失敗 - 它不反對所有傳統的SGML廢話並堅持使用格式良好的XML,如果HTML委員會這樣做了,那麼未來的模板引擎會更容易使用標準XML API編寫)。我前段時間編寫了一個XML-based template engine,它使用XMLReader API ,但爲了使它與HTML一起工作,您必須將條目添加到您的Libxml系統目錄中。這樣做效果不錯,但是很痛苦,大多數人會放棄並使用更簡單的東西。

1

下面是一些基於XML的模板引擎,我知道的:

http://phptal.org/

http://code.google.com/p/querytemplates/

http://www.hyperkit-software.com/projects/phptemplates/index.html

在性能方面,我不認爲大多數基於XML基於腳本的模板引擎在編譯階段顯着更快 - 大多數PHP的模板引擎使用編譯,因此編譯器的性能通常會受到青睞更可擴展和可維護的引擎代碼庫,以及生成更多優化的編譯模板。正如Robin指出的那樣,由於模板已經編譯完成,所以沒有人真正關心編譯階段可能有多快或多慢。

但是,對於基於XML的模板引擎還有其他參數。就個人而言,我不喜歡混合兩種不同標籤語法的想法,其中一種(Smarty)不能使用普通XML工具進行分析,處理或驗證。爲了澄清,是的,您可以解析Smarty模板的XML部分,但不能解析或修改Smarty標籤,這看起來像是XML工具的文本。

針對自定義語法(如Smarty和大多數其他模板引擎中使用的)的另一個常見論點是PHP已經具有這些模板引擎提供的所有內容的語法 - 例如,<?=ucfirst($person->name)?>與普通PHP模板中的{$person.name|ucfirst}類似。它使用PHP開發人員已知的語法,這意味着沒有學習曲線,沒有編譯步驟,沒有需要部署的引擎,沒有運行時間開銷來呈現模板等。

+0

沒有學習曲線是好的,但保證良好的形態也很好。我知道phptal提供了後者,我知道php本身不。 – kojiro 2013-02-06 21:29:37