PHP:MVC迷思

來源:互聯網
上載者:User
近來設計模式風行,MVC隨處可見,PHP領域也不例外,很多論壇都開始討論在PHP中使用MVC。然而,M、V、C在PHP中到底該如何??MVC真的適合PHP嗎?這裡Easy給出一些自己的思考。


MVC的原型

MVC本來是存在於Desktop程式中的,M是指資料模型,V是指使用者介面,C則是控制器。使用MVC的目的是將M和V的實現代碼分離,從而使同一個程式可以使用不同的表現形式。比如一批統計資料你可以分別用柱狀圖、餅圖來表示。C存在的目的則是確保M和V的同步,一旦M改變,V應該同步更新。


JAVA中的MVC

JAVA把MVC引入了Web領域,並在此基礎上架構出了一套稱為Model2的體系。由於Web的特殊性,JAVA中的MVC和Desktop中的MVC並不完全一致。主要原因是Web中的V不是持續的,使用者每訪問一次,V就要重建一次,所以V始終是和M一致的,不需要C來控制同步。那麼JAVA中的C在幹什嗎?JAVA中的C通常用於流程的轉向,其實用的是Dispatch模式,不再是Desktop中的C了。



PHP中的MVC

要在PHP中原封不動的COPY JAVA的MVC是不可能的。問題主要表現在M上,在JAVA中,M是獨立於商務邏輯和表現邏輯的資料模型,在伺服器端跨頁面存在,JAVA Bean扮演的就是這個腳色。而PHP進程並不長時間駐留於記憶體,只在PHP頁面開始執行時建立,在頁面解釋執行結束時就已經結束。在這樣的情況下,我們根本無法直接實現M。所以所有聲稱實現了MVC模式的PHP程式都只能通過類比手段來實現M。實現的方式一般是在當前頁面結束前把資料存入資料庫或者cookie/session,在下一個頁面中再透過資料庫或者cookie/session重建M。這樣的方式和JAVA中的Bean比起來可以說是開銷巨大,本來往記憶體中寫資料的簡單操作現在要從伺服器端傳到用戶端或者資料庫,然後再傳回來。與其用這麼大的開銷來維護一個資料模型再在最後把這個模型塞回資料庫,還不如直接根據需要更新資料庫裡邊的資料。

現在PHP中的MVC架構可以用下圖來表示。





然後我們再來看V。現在很多PHP程式簡單的使用了一些模板技術就在說明中寫“採用MVC架構”。其實絕大多數的PHP模板程式都只是分離HTML和PHP的,而非MVC強調的顯示邏輯和商務邏輯分離。一個混用HTML和PHP的頁面一樣可以是MVC的一部份。如何分離顯示邏輯和商務邏輯至今沒有一個滿意的方案。我個人則比較認同http://www.phpe.net/articles/384.shtml的實現方案。至於C,和JAVA中差不多,還是被用作轉向,這個在PHP中其實並不重要。


一個極耗資源的M + 一個區別不大的V + 可有可無的C 構成了PHP中所謂的MVC。

基於以上分析,Easy認為,PHP原有的3層構架比所謂的MVC更為高效,而3層構架中的表現層要解決的問題MVC中的V也同樣存在。一個改進後的3層架構比MVC更適用於PHP。

PS:有的方案把商務邏輯併入M中(http://www.phpe.net/articles/382.shtml),這其實是MVC的思想背道而馳的。

更多相關討論請到討論區:http://club.phpe.net/index.php?act=ST&f=15&t=4720

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.