PHP:MVC迷思
發(fā)表時間:2023-08-13 來源:明輝站整理相關軟件相關文章人氣:
[摘要]近來設計模式風行,MVC隨處可見,PHP領域也不例外,很多論壇都開始討論在PHP中使用MVC。然而,M、V、C在PHP中到底該如何實現(xiàn)?MVC真的適合PHP么?這里Easy給出一些自己的思考! ...
近來設計模式風行,MVC隨處可見,PHP領域也不例外,很多論壇都開始討論在PHP中使用MVC。然而,M、V、C在PHP中到底該如何實現(xiàn)?MVC真的適合PHP么?這里Easy給出一些自己的思考。
MVC的原型
MVC本來是存在于Desktop程序中的,M是指數(shù)據(jù)模型,V是指用戶界面,C則是控制器。使用MVC的目的是將M和V的實現(xiàn)代碼分離,從而使同一個程序可以使用不同的表現(xiàn)形式。比如一批統(tǒng)計數(shù)據(jù)你可以分別用柱狀圖、餅圖來表示。C存在的目的則是確保M和V的同步,一旦M改變,V應該同步更新。
JAVA中的MVC
JAVA把MVC引入了Web領域,并在此基礎上架構出了一套稱為Model2的體系。由于Web的特殊性,JAVA中的MVC和Desktop中的MVC并不完全一致。主要原因是Web中的V不是持續(xù)的,用戶每訪問一次,V就要重新生成一次,所以V始終是和M一致的,不需要C來控制同步。那么JAVA中的C在干什么?JAVA中的C通常用于流程的轉向,其實用的是Dispatch模式,不再是Desktop中的C了。
PHP中的MVC
要在PHP中原封不動的COPY JAVA的MVC是不可能的。問題主要表現(xiàn)在M上,在JAVA中,M是獨立于業(yè)務邏輯和表現(xiàn)邏輯的數(shù)據(jù)模型,在服務器端跨頁面存在,JAVA Bean扮演的就是這個腳色。而PHP進程并不長時間駐留于內存,只在PHP頁面開始執(zhí)行時創(chuàng)建,在頁面解釋執(zhí)行結束時就已經(jīng)結束。在這樣的情況下,我們根本無法直接實現(xiàn)M。所以所有聲稱實現(xiàn)了MVC模式的PHP程式都只能通過模擬手段來實現(xiàn)M。實現(xiàn)的方式一般是在當前頁面結束前把數(shù)據(jù)存入數(shù)據(jù)庫或者cookie/session,在下一個頁面中再透過數(shù)據(jù)庫或者cookie/session重建M。這樣的方式和JAVA中的Bean比起來可以說是開銷巨大,本來往內存中寫數(shù)據(jù)的簡單操作現(xiàn)在要從服務器端傳到客戶端或者數(shù)據(jù)庫,然后再傳回來。與其用這么大的開銷來維護一個數(shù)據(jù)模型再在最后把這個模型塞回數(shù)據(jù)庫,還不如直接根據(jù)需要更新數(shù)據(jù)庫里邊的數(shù)據(jù)。