PHP 需要樣版引擎嗎?

其實這是爭論已久的問題。因為 設計上本身已有樣版(template)的特性,即以 HTML 為主體,程式碼穿插其中。相比當時流行的 CGI script 語言如 Perl 或 C/C++ 或其他 shell script,每當要在頁面顯示動態資料/HTML tag 的時候除了要 print 以外還要為字串作逃逸處理(escaping), 比他們都來得方便,因為 既可以把程式碼和 HTML 碼放到同一個檔案裏,又不用 escape 程式碼以外的靜態內容,再加上 本身有一大堆實用的函數,所以有很多人從此投入 的懷抱。

除了 PHP 以外,還有兩款跟 PHP 角色非常相似,主流的動態網頁系統,包括同是 96 年推出的產品、微軟的 ASP 以及1998年太陽電腦發佈的 JSP。這兩款動態網頁早期的版本跟 PHP 差不多,也是程式碼跟網頁靜態內容放到同一個檔案裏去。不過,與 PHP 不同的是,這兩款動態網語言的程式碼還可以放到其他地方去。ASP 的是 COM(Component Object Model),JSP 的是 Servlet。

也因為可以有這種程式碼「規劃」,在微軟的 IIS 平台和太陽的 J2EE 平台上首先出現一堆又一堆的 MVC 框架。拿 J2EE 來說,POJO,Servlet 和 JSP 本身便是一套完整的 MVC Framework。程式編寫員可以細緻區分那些是「版面美化用」的邏輯,那些是「商業應用」的邏輯。

大家看 MVC 是好的,所以大家也想在 PHP 搞 MVC。但是 PHP 由開始便被設計為樣版語言,它註定就是要跟 HTML 一同存在,所以儘管有眾多現成的 MVC framework,寫出來的程式看來仍像一個個沒關聯的動態網頁。你看 J2EE 雖然有了 JSP 這套初始樣版語言,但是仍有為數不少的樣版引擎出現(Faces,Struts,JSP 2.0 也勉強算是另一套全新的樣版引擎),而且沒有人會質疑「J2EE 要不要樣版引擎」,那是因為程式碼不侷限只寫在 JSP 裏。

所以,與其討論「PHP 要不要樣版引擎」,不如問一下自己「PHP 是不是應該變得像 Ruby/Python/Perl」 。不過,現在的 PHP 開發團隊會告訴您 PHP 跟 HTML 混在一起是 PHP 的特色,”This is a feature of PHP”。

7 thoughts on “PHP 需要樣版引擎嗎?

  1. I think the way it’s heading for PHP is fine. Since ppl who want to use template in PHP can use Smarty (http://smarty.php.net/) or other engine, and stay away if they don’t.

    The template is useful to allow developer to build their applications and allow their users to change the layout as needed. blog is an example, developer can provide a template to the layout with the template engine so user can change layout without knowing PHP. I am sure you see in wp that you have to put in code-like snippet (beginning with
    : ” title=”Read entry: “>

    posted by: ” title=”Author: “>

    tags:

    comments:

    trackbacks:

    display: x

    All are replaced with content dynamically in run-time. The user can see more clear how the lapout is like since it’s HTML.

    BTW, nice blog.

  2. 另外我覺得這篇主題探討的方向跟一般使用 Template Engine 的方向有些不同
    一般 PHP 初學者大概不太會去碰觸到 Template,除非他之前有經驗
    開始想用 Template 大多都是想將程式跟 HTML 分離
    而 Template Engine 大多都有提供 cache 的機制
    以大型專案來說,在規劃良來好下來使用 Template 一定有著相當的好處
    執行速度提昇,維護方便等等

  3. Dolittle:
    不是,我說 PHP 從開始便被設計成 template 的模樣,因為它擁有像 template 的語法,即靜態內容跟動態的程式碼寫在同一個檔案裏,以 <?php / ?> 分隔開,基本上就如眾多樣版引擎的 { } 一樣,只不過累贅一點。我說如果 PHP 有一種跟 Perl/Ruby 等等腳本語言一樣的格式,只有純粹程式碼的 script,那麼一堆「PHP 需不需要樣版引擎」的討論即可自動終結。

    當然我沒否認樣版引擎為 PHP 帶來的好處,包括大型專案分工,邏輯分離,程式碼簡化等等。但是覺得我那個不可能實現的夢想,配合一堆由使用者設計,語法更簡單的樣版引擎,真的找不到任何可以挑剔的地方。

  4. Dear mk,
    「我說如果 PHP 有一種跟 Perl/Ruby 等等腳本語言一樣的格式,只有純粹程式碼的 script,那麼一堆「PHP 需不需要樣版引擎」的討論即可自動終結。」

    你這邊所說得「格式」,PHP 應該有支援的才是
    Like this ?

  5. Dolittle:
    你是指 php -r 嗎?的確不用在參數裏輸入 <?php ?>。不過要是程式碼在檔案裏… 我知道是可以,但挺麻煩呢,足以證明 PHP 設計者沒這種打算。

    如果你不是指那個參數,我想你大概誤會了我的意思。

Leave a Reply

Your email address will not be published. Required fields are marked *